Open LiST-GIT opened 10 months ago
The following seems to work:
function func<
T1,
T3 extends { [key: string]: (context: T1) => void },
T4 = {},
>(data: {
T: T1;
K: T3 & ThisType<T1 & T3>;
}) {
}
func({
T: {
bbb: 123,
aaa: () => { return 333; }, // <-- here lies the difference: arrow instead of method
},
K: {
bbb(context) {
console.log(context.aaa());
console.log(context.bbb);
this.ccc();
},
ccc() { },
},
});
This likely belongs to this umbrella issue: https://github.com/microsoft/TypeScript/issues/47599
The problem is the following if
inside instantiateContextualType
:
// If no inferences have been made, and none of the type parameters for which we are inferring
// specify default types, nothing is gained from instantiating as type parameters would just be
// replaced with their constraints similar to the apparent type.
if (
inferenceContext &&
contextFlags! & ContextFlags.Signature &&
some(inferenceContext.inferences, hasInferenceCandidatesOrDefault)
) {
// For contextual signatures we incorporate all inferences made so far, e.g. from return
// types as well as arguments to the left in a function call.
return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper);
}
The condition results true
at the wrong time, too eagerly as far as I understand it, therefore stuff gets instantiated with some default types.
If you change the condition in one of the two following ways you solve this specific issue, but you get failing baselines:
!some(inferenceContext.inferences, hasInferenceCandidatesOrDefault)
seems somewhat more related with the above comment (?), but you get too many failing baselinesevery(inferenceContext.inferences, hasInferenceCandidatesOrDefault)
just a couple of failing baselines, but one of them is about contextual inference and, guess what, it works here but not there anymore
🔎 Search Terms
Generics
🕗 Version & Regression Information
⏯ Playground Link
https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABKSAeAUIriAqBGAGk2xwGZEBTADygrABMBnRAb0QG0BrCgTwC5EjKACcYYAOYBdAQAoICWjQH4AlIgC8APkQA3ODHqIAvkWy4ALBtYnEAeluIAwnAC2LurAmI4IKIigAFjDMjBTQ8EhwwIjy9BSILgCG3MwwfgDucMKciAAOwnC5FMIANjwAdOiaMvSJUIkCLMRYOMp4ANzNiADSyuQAZLhBjDg8Raj4iINkmp1Gak1G6OgoEDJNZq2sXWYARvsCeABMpKZm2ImXMguIwhRQIMJIpC-txmdYJl292+fY+7s5ApqFAFjs-jEEIw4CUKOUSnBxECwIooOVLolripOhDzvIwNDYfDEcjUeUAdjwX9AsFyhB6dccRCvrj6WsbizsF95u0gA
💻 Code
🙁 Actual behavior
display an error message:
'context' is of type 'unknown'. 'context' is of type 'unknown'. 'T4' is declared but its value is never read. 'data' is declared but its value is never read.
🙂 Expected behavior
The type of 'context' should already be determined; it shouldn't be 'unknown'.
Additional information about the issue
No response