Skip to content

Don't defer resolution of indexed access types with reducible object types for writing accesses #54689

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17729,7 +17729,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
// eagerly using the constraint type of 'this' at the given location.
if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== SyntaxKind.IndexedAccessType ?
isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) :
isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)) || isGenericReducibleType(objectType))) {
isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)) || !(accessFlags & AccessFlags.Writing) && isGenericReducibleType(objectType))) {
if (objectType.flags & TypeFlags.AnyOrUnknown) {
return objectType;
}
Expand Down
134 changes: 134 additions & 0 deletions tests/baselines/reference/correlatedUnions.js
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,79 @@ function getValueConcrete<K extends keyof Foo1>(
): Foo1[K] | undefined {
return o[k];
}

// repro from https://github.com/microsoft/TypeScript/issues/54680

type A_54680 = {
type: "A";
value: string;
};

type B_54680 = {
type: "B";
value: number;
};

type Message_54680 = A_54680 | B_54680;

function handle_54680_1<M extends Message_54680>(callbacks: {
[K in M["type"]]: (msg: Extract<M, { type: K }>["value"]) => unknown;
}) {
window.addEventListener("message", (event) => {
const msg = event.data as M;
callbacks[msg.type as keyof typeof callbacks](msg.value);
});
}

function handle_54680_2<M extends Message_54680>(callbacks: {
[K in M["type"]]: (msg: (M & { type: K })["value"]) => unknown;
}) {
window.addEventListener("message", (event) => {
const msg = event.data as M;
callbacks[msg.type as keyof typeof callbacks](msg.value);
});
}

// repro from https://github.com/microsoft/TypeScript/issues/54834

type NumericLiteral_54834 = {
value: number;
type: "NumericLiteral";
};
type StringLiteral_54834 = {
value: string;
type: "StringLiteral";
};
type Identifier_54834 = {
name: string;
type: "Identifier";
};
type CallExpression_54834 = {
name: string;
arguments: DropbearNode_54834[];
type: "CallExpression";
};

type DropbearNode_54834 =
| NumericLiteral_54834
| StringLiteral_54834
| Identifier_54834
| CallExpression_54834;

type TypeMap_54834 = {
[K in DropbearNode_54834["type"]]: Extract<DropbearNode_54834, { type: K }>;
};

type Visitor_54834 = {
[K in keyof TypeMap_54834]: (node: Readonly<TypeMap_54834[K]>) => void;
};

function visitNode_54834<K extends keyof TypeMap_54834>(
node: Readonly<TypeMap_54834[K]>,
v: Visitor_54834
) {
v[node.type](node);
}


//// [correlatedUnions.js]
Expand Down Expand Up @@ -433,6 +506,21 @@ function getConfigOrDefault(userConfig, key, defaultValue) {
function getValueConcrete(o, k) {
return o[k];
}
function handle_54680_1(callbacks) {
window.addEventListener("message", function (event) {
var msg = event.data;
callbacks[msg.type](msg.value);
});
}
function handle_54680_2(callbacks) {
window.addEventListener("message", function (event) {
var msg = event.data;
callbacks[msg.type](msg.value);
});
}
function visitNode_54834(node, v) {
v[node.type](node);
}


//// [correlatedUnions.d.ts]
Expand Down Expand Up @@ -613,3 +701,49 @@ type Foo1 = {
y: string;
};
declare function getValueConcrete<K extends keyof Foo1>(o: Partial<Foo1>, k: K): Foo1[K] | undefined;
type A_54680 = {
type: "A";
value: string;
};
type B_54680 = {
type: "B";
value: number;
};
type Message_54680 = A_54680 | B_54680;
declare function handle_54680_1<M extends Message_54680>(callbacks: {
[K in M["type"]]: (msg: Extract<M, {
type: K;
}>["value"]) => unknown;
}): void;
declare function handle_54680_2<M extends Message_54680>(callbacks: {
[K in M["type"]]: (msg: (M & {
type: K;
})["value"]) => unknown;
}): void;
type NumericLiteral_54834 = {
value: number;
type: "NumericLiteral";
};
type StringLiteral_54834 = {
value: string;
type: "StringLiteral";
};
type Identifier_54834 = {
name: string;
type: "Identifier";
};
type CallExpression_54834 = {
name: string;
arguments: DropbearNode_54834[];
type: "CallExpression";
};
type DropbearNode_54834 = NumericLiteral_54834 | StringLiteral_54834 | Identifier_54834 | CallExpression_54834;
type TypeMap_54834 = {
[K in DropbearNode_54834["type"]]: Extract<DropbearNode_54834, {
type: K;
}>;
};
type Visitor_54834 = {
[K in keyof TypeMap_54834]: (node: Readonly<TypeMap_54834[K]>) => void;
};
declare function visitNode_54834<K extends keyof TypeMap_54834>(node: Readonly<TypeMap_54834[K]>, v: Visitor_54834): void;
224 changes: 224 additions & 0 deletions tests/baselines/reference/correlatedUnions.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -1016,3 +1016,227 @@ function getValueConcrete<K extends keyof Foo1>(
>k : Symbol(k, Decl(correlatedUnions.ts, 295, 19))
}

// repro from https://github.com/microsoft/TypeScript/issues/54680

type A_54680 = {
>A_54680 : Symbol(A_54680, Decl(correlatedUnions.ts, 299, 1))

type: "A";
>type : Symbol(type, Decl(correlatedUnions.ts, 303, 16))

value: string;
>value : Symbol(value, Decl(correlatedUnions.ts, 304, 12))

};

type B_54680 = {
>B_54680 : Symbol(B_54680, Decl(correlatedUnions.ts, 306, 2))

type: "B";
>type : Symbol(type, Decl(correlatedUnions.ts, 308, 16))

value: number;
>value : Symbol(value, Decl(correlatedUnions.ts, 309, 12))

};

type Message_54680 = A_54680 | B_54680;
>Message_54680 : Symbol(Message_54680, Decl(correlatedUnions.ts, 311, 2))
>A_54680 : Symbol(A_54680, Decl(correlatedUnions.ts, 299, 1))
>B_54680 : Symbol(B_54680, Decl(correlatedUnions.ts, 306, 2))

function handle_54680_1<M extends Message_54680>(callbacks: {
>handle_54680_1 : Symbol(handle_54680_1, Decl(correlatedUnions.ts, 313, 39))
>M : Symbol(M, Decl(correlatedUnions.ts, 315, 24))
>Message_54680 : Symbol(Message_54680, Decl(correlatedUnions.ts, 311, 2))
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 315, 49))

[K in M["type"]]: (msg: Extract<M, { type: K }>["value"]) => unknown;
>K : Symbol(K, Decl(correlatedUnions.ts, 316, 3))
>M : Symbol(M, Decl(correlatedUnions.ts, 315, 24))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 316, 21))
>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --))
>M : Symbol(M, Decl(correlatedUnions.ts, 315, 24))
>type : Symbol(type, Decl(correlatedUnions.ts, 316, 38))
>K : Symbol(K, Decl(correlatedUnions.ts, 316, 3))

}) {
window.addEventListener("message", (event) => {
>window.addEventListener : Symbol(addEventListener, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
>window : Symbol(window, Decl(lib.dom.d.ts, --, --))
>addEventListener : Symbol(addEventListener, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
>event : Symbol(event, Decl(correlatedUnions.ts, 318, 38))

const msg = event.data as M;
>msg : Symbol(msg, Decl(correlatedUnions.ts, 319, 9))
>event.data : Symbol(MessageEvent.data, Decl(lib.dom.d.ts, --, --))
>event : Symbol(event, Decl(correlatedUnions.ts, 318, 38))
>data : Symbol(MessageEvent.data, Decl(lib.dom.d.ts, --, --))
>M : Symbol(M, Decl(correlatedUnions.ts, 315, 24))

callbacks[msg.type as keyof typeof callbacks](msg.value);
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 315, 49))
>msg.type : Symbol(type, Decl(correlatedUnions.ts, 303, 16), Decl(correlatedUnions.ts, 308, 16))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 319, 9))
>type : Symbol(type, Decl(correlatedUnions.ts, 303, 16), Decl(correlatedUnions.ts, 308, 16))
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 315, 49))
>msg.value : Symbol(value, Decl(correlatedUnions.ts, 304, 12), Decl(correlatedUnions.ts, 309, 12))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 319, 9))
>value : Symbol(value, Decl(correlatedUnions.ts, 304, 12), Decl(correlatedUnions.ts, 309, 12))

});
}

function handle_54680_2<M extends Message_54680>(callbacks: {
>handle_54680_2 : Symbol(handle_54680_2, Decl(correlatedUnions.ts, 322, 1))
>M : Symbol(M, Decl(correlatedUnions.ts, 324, 24))
>Message_54680 : Symbol(Message_54680, Decl(correlatedUnions.ts, 311, 2))
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 324, 49))

[K in M["type"]]: (msg: (M & { type: K })["value"]) => unknown;
>K : Symbol(K, Decl(correlatedUnions.ts, 325, 3))
>M : Symbol(M, Decl(correlatedUnions.ts, 324, 24))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 325, 21))
>M : Symbol(M, Decl(correlatedUnions.ts, 324, 24))
>type : Symbol(type, Decl(correlatedUnions.ts, 325, 32))
>K : Symbol(K, Decl(correlatedUnions.ts, 325, 3))

}) {
window.addEventListener("message", (event) => {
>window.addEventListener : Symbol(addEventListener, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
>window : Symbol(window, Decl(lib.dom.d.ts, --, --))
>addEventListener : Symbol(addEventListener, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
>event : Symbol(event, Decl(correlatedUnions.ts, 327, 38))

const msg = event.data as M;
>msg : Symbol(msg, Decl(correlatedUnions.ts, 328, 9))
>event.data : Symbol(MessageEvent.data, Decl(lib.dom.d.ts, --, --))
>event : Symbol(event, Decl(correlatedUnions.ts, 327, 38))
>data : Symbol(MessageEvent.data, Decl(lib.dom.d.ts, --, --))
>M : Symbol(M, Decl(correlatedUnions.ts, 324, 24))

callbacks[msg.type as keyof typeof callbacks](msg.value);
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 324, 49))
>msg.type : Symbol(type, Decl(correlatedUnions.ts, 303, 16), Decl(correlatedUnions.ts, 308, 16))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 328, 9))
>type : Symbol(type, Decl(correlatedUnions.ts, 303, 16), Decl(correlatedUnions.ts, 308, 16))
>callbacks : Symbol(callbacks, Decl(correlatedUnions.ts, 324, 49))
>msg.value : Symbol(value, Decl(correlatedUnions.ts, 304, 12), Decl(correlatedUnions.ts, 309, 12))
>msg : Symbol(msg, Decl(correlatedUnions.ts, 328, 9))
>value : Symbol(value, Decl(correlatedUnions.ts, 304, 12), Decl(correlatedUnions.ts, 309, 12))

});
}

// repro from https://github.com/microsoft/TypeScript/issues/54834

type NumericLiteral_54834 = {
>NumericLiteral_54834 : Symbol(NumericLiteral_54834, Decl(correlatedUnions.ts, 331, 1))

value: number;
>value : Symbol(value, Decl(correlatedUnions.ts, 335, 29))

type: "NumericLiteral";
>type : Symbol(type, Decl(correlatedUnions.ts, 336, 16))

};
type StringLiteral_54834 = {
>StringLiteral_54834 : Symbol(StringLiteral_54834, Decl(correlatedUnions.ts, 338, 2))

value: string;
>value : Symbol(value, Decl(correlatedUnions.ts, 339, 28))

type: "StringLiteral";
>type : Symbol(type, Decl(correlatedUnions.ts, 340, 16))

};
type Identifier_54834 = {
>Identifier_54834 : Symbol(Identifier_54834, Decl(correlatedUnions.ts, 342, 2))

name: string;
>name : Symbol(name, Decl(correlatedUnions.ts, 343, 25))

type: "Identifier";
>type : Symbol(type, Decl(correlatedUnions.ts, 344, 15))

};
type CallExpression_54834 = {
>CallExpression_54834 : Symbol(CallExpression_54834, Decl(correlatedUnions.ts, 346, 2))

name: string;
>name : Symbol(name, Decl(correlatedUnions.ts, 347, 29))

arguments: DropbearNode_54834[];
>arguments : Symbol(arguments, Decl(correlatedUnions.ts, 348, 15))
>DropbearNode_54834 : Symbol(DropbearNode_54834, Decl(correlatedUnions.ts, 351, 2))

type: "CallExpression";
>type : Symbol(type, Decl(correlatedUnions.ts, 349, 34))

};

type DropbearNode_54834 =
>DropbearNode_54834 : Symbol(DropbearNode_54834, Decl(correlatedUnions.ts, 351, 2))

| NumericLiteral_54834
>NumericLiteral_54834 : Symbol(NumericLiteral_54834, Decl(correlatedUnions.ts, 331, 1))

| StringLiteral_54834
>StringLiteral_54834 : Symbol(StringLiteral_54834, Decl(correlatedUnions.ts, 338, 2))

| Identifier_54834
>Identifier_54834 : Symbol(Identifier_54834, Decl(correlatedUnions.ts, 342, 2))

| CallExpression_54834;
>CallExpression_54834 : Symbol(CallExpression_54834, Decl(correlatedUnions.ts, 346, 2))

type TypeMap_54834 = {
>TypeMap_54834 : Symbol(TypeMap_54834, Decl(correlatedUnions.ts, 357, 25))

[K in DropbearNode_54834["type"]]: Extract<DropbearNode_54834, { type: K }>;
>K : Symbol(K, Decl(correlatedUnions.ts, 360, 3))
>DropbearNode_54834 : Symbol(DropbearNode_54834, Decl(correlatedUnions.ts, 351, 2))
>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --))
>DropbearNode_54834 : Symbol(DropbearNode_54834, Decl(correlatedUnions.ts, 351, 2))
>type : Symbol(type, Decl(correlatedUnions.ts, 360, 66))
>K : Symbol(K, Decl(correlatedUnions.ts, 360, 3))

};

type Visitor_54834 = {
>Visitor_54834 : Symbol(Visitor_54834, Decl(correlatedUnions.ts, 361, 2))

[K in keyof TypeMap_54834]: (node: Readonly<TypeMap_54834[K]>) => void;
>K : Symbol(K, Decl(correlatedUnions.ts, 364, 3))
>TypeMap_54834 : Symbol(TypeMap_54834, Decl(correlatedUnions.ts, 357, 25))
>node : Symbol(node, Decl(correlatedUnions.ts, 364, 31))
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
>TypeMap_54834 : Symbol(TypeMap_54834, Decl(correlatedUnions.ts, 357, 25))
>K : Symbol(K, Decl(correlatedUnions.ts, 364, 3))

};

function visitNode_54834<K extends keyof TypeMap_54834>(
>visitNode_54834 : Symbol(visitNode_54834, Decl(correlatedUnions.ts, 365, 2))
>K : Symbol(K, Decl(correlatedUnions.ts, 367, 25))
>TypeMap_54834 : Symbol(TypeMap_54834, Decl(correlatedUnions.ts, 357, 25))

node: Readonly<TypeMap_54834[K]>,
>node : Symbol(node, Decl(correlatedUnions.ts, 367, 56))
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
>TypeMap_54834 : Symbol(TypeMap_54834, Decl(correlatedUnions.ts, 357, 25))
>K : Symbol(K, Decl(correlatedUnions.ts, 367, 25))

v: Visitor_54834
>v : Symbol(v, Decl(correlatedUnions.ts, 368, 35))
>Visitor_54834 : Symbol(Visitor_54834, Decl(correlatedUnions.ts, 361, 2))

) {
v[node.type](node);
>v : Symbol(v, Decl(correlatedUnions.ts, 368, 35))
>node.type : Symbol(type, Decl(correlatedUnions.ts, 360, 66), Decl(correlatedUnions.ts, 336, 16), Decl(correlatedUnions.ts, 360, 66), Decl(correlatedUnions.ts, 340, 16), Decl(correlatedUnions.ts, 360, 66) ... and 3 more)
>node : Symbol(node, Decl(correlatedUnions.ts, 367, 56))
>type : Symbol(type, Decl(correlatedUnions.ts, 360, 66), Decl(correlatedUnions.ts, 336, 16), Decl(correlatedUnions.ts, 360, 66), Decl(correlatedUnions.ts, 340, 16), Decl(correlatedUnions.ts, 360, 66) ... and 3 more)
>node : Symbol(node, Decl(correlatedUnions.ts, 367, 56))
}

Loading