diff --git a/packages/typescript/src/api/async/api.ts b/packages/typescript/src/api/async/api.ts index 1fc6e7d3359b1..453326890b800 100644 --- a/packages/typescript/src/api/async/api.ts +++ b/packages/typescript/src/api/async/api.ts @@ -112,6 +112,7 @@ import type { EmitResult, FormatDiagnosticsHost, FreshableType, + GenericType, GetImportEditsForSymbolsOptions, IdentifierTypePredicate, ImportAdderAction as APIImportAdderAction, @@ -169,6 +170,7 @@ export type { EmitResult, FormatDiagnosticsHost, FreshableType, + GenericType, GetImportEditsForSymbolsOptions, IdentifierTypePredicate, IndexedAccessType, diff --git a/packages/typescript/src/api/async/types.ts b/packages/typescript/src/api/async/types.ts index 8df18f408c5b7..07475f7ed492b 100644 --- a/packages/typescript/src/api/async/types.ts +++ b/packages/typescript/src/api/async/types.ts @@ -180,7 +180,7 @@ export interface ObjectType extends Type { /** Type references (ObjectFlags.Reference) — e.g. Array, Map */ export interface TypeReference extends ObjectType { /** Get the generic target type (e.g. Array for Array) */ - getTarget(): Promise; + getTarget(): Promise; } /** References to tuple types */ @@ -199,8 +199,12 @@ export interface InterfaceType extends TypeReference { getLocalTypeParameters(): Promise; } +/** Generic types */ +export interface GenericType extends InterfaceType, TypeReference { +} + /** Tuple type targets (ObjectFlags.Tuple) */ -export interface TupleType extends InterfaceType { +export interface TupleType extends GenericType { /** Get this tuple target */ getTarget(): Promise; /** Per-element flags (Required, Optional, Rest, Variadic) */ diff --git a/packages/typescript/src/api/sync/api.ts b/packages/typescript/src/api/sync/api.ts index 5673605e5f26f..f9df50e71e230 100644 --- a/packages/typescript/src/api/sync/api.ts +++ b/packages/typescript/src/api/sync/api.ts @@ -129,6 +129,7 @@ import type { EmitResult, FormatDiagnosticsHost, FreshableType, + GenericType, GetImportEditsForSymbolsOptions, IdentifierTypePredicate, ImportAdderAction as APIImportAdderAction, @@ -186,6 +187,7 @@ export type { EmitResult, FormatDiagnosticsHost, FreshableType, + GenericType, GetImportEditsForSymbolsOptions, IdentifierTypePredicate, IndexedAccessType, diff --git a/packages/typescript/src/api/sync/types.ts b/packages/typescript/src/api/sync/types.ts index 8a6987adf024b..4244bb6e3a88b 100644 --- a/packages/typescript/src/api/sync/types.ts +++ b/packages/typescript/src/api/sync/types.ts @@ -245,8 +245,8 @@ export interface ObjectType extends Type { export interface TypeReference extends ObjectType { /** Get the generic target type (e.g. Array for Array) */ getTarget: { - (): Type; - gen(): Generator; + (): GenericType; + gen(): Generator; }; } @@ -278,8 +278,12 @@ export interface InterfaceType extends TypeReference { }; } +/** Generic types */ +export interface GenericType extends InterfaceType, TypeReference { +} + /** Tuple type targets (ObjectFlags.Tuple) */ -export interface TupleType extends InterfaceType { +export interface TupleType extends GenericType { /** Get this tuple target */ getTarget: { (): TupleType; diff --git a/packages/typescript/test/async/api.test.ts b/packages/typescript/test/async/api.test.ts index 6ac85d8693c6c..d90dc470ab987 100644 --- a/packages/typescript/test/async/api.test.ts +++ b/packages/typescript/test/async/api.test.ts @@ -2464,6 +2464,9 @@ export const tuple: readonly [number, string?, ...boolean[]] = [1]; const target = await ref.getTarget(); assert.ok(target); assert.ok(target.flags & TypeFlags.Object); + const typeParameters = await target.getTypeParameters(); + assert.ok(typeParameters); + assert.equal(typeParameters.length, 1); const properties = await type.getProperties(); assert.ok(properties.some(property => property.name === "length")); assert.equal((await type.getProperty("length"))?.name, "length"); diff --git a/packages/typescript/test/sync/api.test.ts b/packages/typescript/test/sync/api.test.ts index cb2322eaa2e16..976fdb0d9f9a3 100644 --- a/packages/typescript/test/sync/api.test.ts +++ b/packages/typescript/test/sync/api.test.ts @@ -2351,6 +2351,9 @@ export const tuple: readonly [number, string?, ...boolean[]] = [1]; const target = ref.getTarget(); assert.ok(target); assert.ok(target.flags & TypeFlags.Object); + const typeParameters = target.getTypeParameters(); + assert.ok(typeParameters); + assert.equal(typeParameters.length, 1); const properties = type.getProperties(); assert.ok(properties.some(property => property.name === "length")); assert.equal((type.getProperty("length"))?.name, "length");