From 38f71f31eb8cef9b442039122d5f2ae0b555283c Mon Sep 17 00:00:00 2001 From: andre-fajar-n Date: Tue, 13 Oct 2026 20:41:07 +0700 Subject: [PATCH] Fix GetTypeNodePrecedence nil panic when stripInternal strips type alias RHS --- .../transformers/declarations/transform.go | 7 ++++++- .../declarationEmitStripInternalTypeAliasRHS.js | 15 +++++++++++++++ ...clarationEmitStripInternalTypeAliasRHS.symbols | 13 +++++++++++++ ...declarationEmitStripInternalTypeAliasRHS.types | 10 ++++++++++ .../declarationEmitStripInternalTypeAliasRHS.ts | 7 +++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.js create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.types create mode 100644 tsc/testdata/tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts diff --git a/tsc/internal/transformers/declarations/transform.go b/tsc/internal/transformers/declarations/transform.go index f2bb66a6803cb..93d96761460fb 100644 --- a/tsc/internal/transformers/declarations/transform.go +++ b/tsc/internal/transformers/declarations/transform.go @@ -1791,12 +1791,17 @@ func (tx *DeclarationTransformer) transformTopLevelDeclaration(input *ast.Node) func (tx *DeclarationTransformer) transformTypeAliasDeclaration(input *ast.TypeAliasDeclaration) *ast.Node { tx.needsDeclare = false + t := tx.Visitor().Visit(input.Type) + if t == nil { + // stripInternal can elide an @internal type RHS; fall back like index signatures + t = tx.Factory().NewKeywordTypeNode(ast.KindAnyKeyword) + } return tx.Factory().UpdateTypeAliasDeclaration( input, tx.ensureModifiers(input.AsNode()), input.Name(), tx.Visitor().VisitNodes(input.TypeParameters), - tx.Visitor().Visit(input.Type), + t, ) } diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.js b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.js new file mode 100644 index 0000000000000..42c6d66790d28 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.js @@ -0,0 +1,15 @@ +//// [tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts] //// + +//// [declarationEmitStripInternalTypeAliasRHS.ts] +interface Foo {} +export type T = + /** @internal */ + Foo; + + +//// [declarationEmitStripInternalTypeAliasRHS.js] +export {}; + + +//// [declarationEmitStripInternalTypeAliasRHS.d.ts] +export type T = any; diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.symbols b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.symbols new file mode 100644 index 0000000000000..0acbf814f97ab --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.symbols @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts] //// + +=== declarationEmitStripInternalTypeAliasRHS.ts === +interface Foo {} +>Foo : Symbol(Foo, Decl(declarationEmitStripInternalTypeAliasRHS.ts, 0, 0)) + +export type T = +>T : Symbol(T, Decl(declarationEmitStripInternalTypeAliasRHS.ts, 0, 16)) + + /** @internal */ + Foo; +>Foo : Symbol(Foo, Decl(declarationEmitStripInternalTypeAliasRHS.ts, 0, 0)) + diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.types b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.types new file mode 100644 index 0000000000000..a048024e07e7b --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitStripInternalTypeAliasRHS.types @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts] //// + +=== declarationEmitStripInternalTypeAliasRHS.ts === +interface Foo {} +export type T = +>T : Foo + + /** @internal */ + Foo; + diff --git a/tsc/testdata/tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts b/tsc/testdata/tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts new file mode 100644 index 0000000000000..f64b3b8601b67 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/declarationEmitStripInternalTypeAliasRHS.ts @@ -0,0 +1,7 @@ +// @declaration: true +// @stripInternal: true + +interface Foo {} +export type T = + /** @internal */ + Foo;