Skip to content

Commit 1518cd9

Browse files
authored
Fixed declaration emit for undefined properties inferred from functions in other array elements (#53938)
1 parent 2beeb8b commit 1518cd9

5 files changed

+75
-23
lines changed

src/compiler/checker.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7126,35 +7126,36 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
71267126
const methodDeclaration = signatureToSignatureDeclarationHelper(signature, SyntaxKind.MethodSignature, context, { name: propertyName, questionToken: optionalToken }) as MethodSignature;
71277127
typeElements.push(preserveCommentsOn(methodDeclaration));
71287128
}
7129+
if (signatures.length || !optionalToken) {
7130+
return;
7131+
}
7132+
}
7133+
let propertyTypeNode: TypeNode;
7134+
if (shouldUsePlaceholderForProperty(propertySymbol, context)) {
7135+
propertyTypeNode = createElidedInformationPlaceholder(context);
71297136
}
71307137
else {
7131-
let propertyTypeNode: TypeNode;
7132-
if (shouldUsePlaceholderForProperty(propertySymbol, context)) {
7133-
propertyTypeNode = createElidedInformationPlaceholder(context);
7138+
if (propertyIsReverseMapped) {
7139+
context.reverseMappedStack ||= [];
7140+
context.reverseMappedStack.push(propertySymbol as ReverseMappedSymbol);
71347141
}
7135-
else {
7136-
if (propertyIsReverseMapped) {
7137-
context.reverseMappedStack ||= [];
7138-
context.reverseMappedStack.push(propertySymbol as ReverseMappedSymbol);
7139-
}
7140-
propertyTypeNode = propertyType ? serializeTypeForDeclaration(context, propertyType, propertySymbol, saveEnclosingDeclaration) : factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
7141-
if (propertyIsReverseMapped) {
7142-
context.reverseMappedStack!.pop();
7143-
}
7142+
propertyTypeNode = propertyType ? serializeTypeForDeclaration(context, propertyType, propertySymbol, saveEnclosingDeclaration) : factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
7143+
if (propertyIsReverseMapped) {
7144+
context.reverseMappedStack!.pop();
71447145
}
7146+
}
71457147

7146-
const modifiers = isReadonlySymbol(propertySymbol) ? [factory.createToken(SyntaxKind.ReadonlyKeyword)] : undefined;
7147-
if (modifiers) {
7148-
context.approximateLength += 9;
7149-
}
7150-
const propertySignature = factory.createPropertySignature(
7151-
modifiers,
7152-
propertyName,
7153-
optionalToken,
7154-
propertyTypeNode);
7155-
7156-
typeElements.push(preserveCommentsOn(propertySignature));
7148+
const modifiers = isReadonlySymbol(propertySymbol) ? [factory.createToken(SyntaxKind.ReadonlyKeyword)] : undefined;
7149+
if (modifiers) {
7150+
context.approximateLength += 9;
71577151
}
7152+
const propertySignature = factory.createPropertySignature(
7153+
modifiers,
7154+
propertyName,
7155+
optionalToken,
7156+
propertyTypeNode);
7157+
7158+
typeElements.push(preserveCommentsOn(propertySignature));
71587159

71597160
function preserveCommentsOn<T extends Node>(node: T) {
71607161
if (some(propertySymbol.declarations, d => d.kind === SyntaxKind.JSDocPropertyTag)) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [declarationEmitInferredUndefinedPropFromFunctionInArray.ts]
2+
// repro from https://github.com/microsoft/TypeScript/issues/53914
3+
4+
export let b = [{ foo: 0, m() {} }, { bar: 1 }];
5+
6+
//// [declarationEmitInferredUndefinedPropFromFunctionInArray.js]
7+
"use strict";
8+
// repro from https://github.com/microsoft/TypeScript/issues/53914
9+
Object.defineProperty(exports, "__esModule", { value: true });
10+
exports.b = void 0;
11+
exports.b = [{ foo: 0, m: function () { } }, { bar: 1 }];
12+
13+
14+
//// [declarationEmitInferredUndefinedPropFromFunctionInArray.d.ts]
15+
export declare let b: ({
16+
foo: number;
17+
m(): void;
18+
bar?: undefined;
19+
} | {
20+
bar: number;
21+
foo?: undefined;
22+
m?: undefined;
23+
})[];
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/compiler/declarationEmitInferredUndefinedPropFromFunctionInArray.ts ===
2+
// repro from https://github.com/microsoft/TypeScript/issues/53914
3+
4+
export let b = [{ foo: 0, m() {} }, { bar: 1 }];
5+
>b : Symbol(b, Decl(declarationEmitInferredUndefinedPropFromFunctionInArray.ts, 2, 10))
6+
>foo : Symbol(foo, Decl(declarationEmitInferredUndefinedPropFromFunctionInArray.ts, 2, 17))
7+
>m : Symbol(m, Decl(declarationEmitInferredUndefinedPropFromFunctionInArray.ts, 2, 25))
8+
>bar : Symbol(bar, Decl(declarationEmitInferredUndefinedPropFromFunctionInArray.ts, 2, 37))
9+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/declarationEmitInferredUndefinedPropFromFunctionInArray.ts ===
2+
// repro from https://github.com/microsoft/TypeScript/issues/53914
3+
4+
export let b = [{ foo: 0, m() {} }, { bar: 1 }];
5+
>b : ({ foo: number; m(): void; bar?: undefined; } | { bar: number; foo?: undefined; m?: undefined; })[]
6+
>[{ foo: 0, m() {} }, { bar: 1 }] : ({ foo: number; m(): void; } | { bar: number; })[]
7+
>{ foo: 0, m() {} } : { foo: number; m(): void; }
8+
>foo : number
9+
>0 : 0
10+
>m : () => void
11+
>{ bar: 1 } : { bar: number; }
12+
>bar : number
13+
>1 : 1
14+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @declaration: true
2+
3+
// repro from https://github.com/microsoft/TypeScript/issues/53914
4+
5+
export let b = [{ foo: 0, m() {} }, { bar: 1 }];

0 commit comments

Comments
 (0)