diff --git a/type-generation/src/astToIR.ts b/type-generation/src/astToIR.ts index 202f6be..7c09346 100644 --- a/type-generation/src/astToIR.ts +++ b/type-generation/src/astToIR.ts @@ -717,7 +717,12 @@ export class Converter { return arrayType(eltType); } if (Node.isTupleTypeNode(typeNode)) { - const elts = typeNode.getElements().map((elt) => this.typeToIR(elt)); + const elts = typeNode.getElements().map((elt) => { + if (Node.isNamedTupleMember(elt)) { + return this.typeToIR(elt.getTypeNode()); + } + return this.typeToIR(elt); + }); return tupleType(elts); } if (Node.isTypePredicate(typeNode)) { diff --git a/type-generation/tests/a.test.ts b/type-generation/tests/a.test.ts index fc1e29c..de8c877 100644 --- a/type-generation/tests/a.test.ts +++ b/type-generation/tests/a.test.ts @@ -1783,6 +1783,20 @@ describe("emit", () => { ); }); }); + it("named tuple", () => { + const res = emitFile(` + declare var x: [ + key: string, + value: string + ]; + `); + assert.strictEqual( + removeTypeIgnores(res.slice(1).join("\n\n")), + dedent(` + x: tuple[str, str] = ... + `).trim(), + ); + }); describe("adjustments", () => { it("setTimeout", () => { const res = emitIRNoTypeIgnores(convertBuiltinFunction("setTimeout"));