From 8b171d23751e881fe17754092338ece9816b1f6a Mon Sep 17 00:00:00 2001 From: mrazauskas Date: Mon, 7 Sep 2026 20:25:12 +0300 Subject: [PATCH 1/4] Add `GenericType` type Signed-off-by: mrazauskas --- packages/typescript/src/api/async/api.ts | 2 ++ packages/typescript/src/api/async/types.ts | 5 ++++- packages/typescript/src/api/sync/api.ts | 2 ++ packages/typescript/src/api/sync/types.ts | 7 +++++-- packages/typescript/test/async/api.test.ts | 3 +++ packages/typescript/test/sync/api.test.ts | 3 +++ 6 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/typescript/src/api/async/api.ts b/packages/typescript/src/api/async/api.ts index 208313dac3502..56159c18feb58 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..ba9720252c2ff 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,6 +199,9 @@ export interface InterfaceType extends TypeReference { getLocalTypeParameters(): Promise; } +/** Generic types */ +export type GenericType = InterfaceType & TypeReference; + /** Tuple type targets (ObjectFlags.Tuple) */ export interface TupleType extends InterfaceType { /** Get this tuple target */ diff --git a/packages/typescript/src/api/sync/api.ts b/packages/typescript/src/api/sync/api.ts index 4ec27f4805f98..5a95ec181b536 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..c3a90c7b9282a 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,6 +278,9 @@ export interface InterfaceType extends TypeReference { }; } +/** Generic types */ +export type GenericType = InterfaceType & TypeReference; + /** Tuple type targets (ObjectFlags.Tuple) */ export interface TupleType extends InterfaceType { /** Get this tuple target */ 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"); From e132a269a6c647b0f1163561c7512b8769ffa9e1 Mon Sep 17 00:00:00 2001 From: mrazauskas Date: Wed, 9 Sep 2026 09:33:27 +0300 Subject: [PATCH 2/4] change to interface Signed-off-by: mrazauskas --- packages/typescript/src/api/async/types.ts | 3 ++- packages/typescript/src/api/sync/types.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/typescript/src/api/async/types.ts b/packages/typescript/src/api/async/types.ts index ba9720252c2ff..3e3aa2f283bc5 100644 --- a/packages/typescript/src/api/async/types.ts +++ b/packages/typescript/src/api/async/types.ts @@ -200,7 +200,8 @@ export interface InterfaceType extends TypeReference { } /** Generic types */ -export type GenericType = InterfaceType & TypeReference; +export interface GenericType extends InterfaceType, TypeReference { +} /** Tuple type targets (ObjectFlags.Tuple) */ export interface TupleType extends InterfaceType { diff --git a/packages/typescript/src/api/sync/types.ts b/packages/typescript/src/api/sync/types.ts index c3a90c7b9282a..3f2df3b2ead07 100644 --- a/packages/typescript/src/api/sync/types.ts +++ b/packages/typescript/src/api/sync/types.ts @@ -279,7 +279,8 @@ export interface InterfaceType extends TypeReference { } /** Generic types */ -export type GenericType = InterfaceType & TypeReference; +export interface GenericType extends InterfaceType, TypeReference { +} /** Tuple type targets (ObjectFlags.Tuple) */ export interface TupleType extends InterfaceType { From 9e84e12e10b66cbb0d83b9ec651454acd603d06e Mon Sep 17 00:00:00 2001 From: Tom Mrazauskas Date: Wed, 9 Sep 2026 09:44:52 +0300 Subject: [PATCH 3/4] suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- packages/typescript/src/api/async/types.ts | 2 +- packages/typescript/src/api/sync/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/typescript/src/api/async/types.ts b/packages/typescript/src/api/async/types.ts index 3e3aa2f283bc5..9a6891d4085fa 100644 --- a/packages/typescript/src/api/async/types.ts +++ b/packages/typescript/src/api/async/types.ts @@ -204,7 +204,7 @@ 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/types.ts b/packages/typescript/src/api/sync/types.ts index 3f2df3b2ead07..d6042587acd1e 100644 --- a/packages/typescript/src/api/sync/types.ts +++ b/packages/typescript/src/api/sync/types.ts @@ -283,7 +283,7 @@ 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; From 8f11f35dcf1de3929efa2e7f36c45e4c06a9455d Mon Sep 17 00:00:00 2001 From: mrazauskas Date: Wed, 9 Sep 2026 09:57:32 +0300 Subject: [PATCH 4/4] format Signed-off-by: mrazauskas --- packages/typescript/src/api/async/types.ts | 2 +- packages/typescript/src/api/sync/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/typescript/src/api/async/types.ts b/packages/typescript/src/api/async/types.ts index 9a6891d4085fa..07475f7ed492b 100644 --- a/packages/typescript/src/api/async/types.ts +++ b/packages/typescript/src/api/async/types.ts @@ -204,7 +204,7 @@ export interface GenericType extends InterfaceType, TypeReference { } /** Tuple type targets (ObjectFlags.Tuple) */ -export interface TupleType extends GenericType { +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/types.ts b/packages/typescript/src/api/sync/types.ts index d6042587acd1e..4244bb6e3a88b 100644 --- a/packages/typescript/src/api/sync/types.ts +++ b/packages/typescript/src/api/sync/types.ts @@ -283,7 +283,7 @@ export interface GenericType extends InterfaceType, TypeReference { } /** Tuple type targets (ObjectFlags.Tuple) */ -export interface TupleType extends GenericType { +export interface TupleType extends GenericType { /** Get this tuple target */ getTarget: { (): TupleType;