TypeScript Version: 3.7.2
Search Terms: extends, type inference
Code
Key parts to look at in this code are the definition of funcA which specifies the type of the argument to be A | B, but since it is typed as Slowboy<Payload> it goes through an extends undefined check which changes the expected argument type of funcA from A | B to A & B.
type A = {
isNew: true;
extra: {
name: string,
age: number
}
}
type B = {
isNew: false;
}
type AorB = A | B
type Data<T> = {
name: string;
payload: T
}
type SlowBoy<Payload> = Payload extends undefined ?
(payload?: undefined) => Data<undefined> :
(payload: Payload) => Data<Payload>;
const funcA: SlowBoy<AorB> = (payload: AorB) => ({
name: "A",
payload
})
funcA({ //Shows the expected type of argument to funcA as A & B
isNew: true,
extra: {
name: 'ijxsid',
age: 310
}
})
Expected behavior:
I expect the extends keyword to check if the Payload type extends undefined and if its the second case in which the Payload doesn't extend undefined, the Payload type should remain as applied in the definition of funcA, that is A | B.
Actual behavior:
The Payload type applied in the definition of funcA gets modified by the extends type check from A | B to A & B.
Is this the expected behavior of extends? Cause I don't think the type checks done by extends undefined should stay after the check has already determined the type.
Playground Link: https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=37&pc=3#code/FAFwngDgpgBAgjAvDA3sGGYEsDOA5KAdwC4YQAnAVygG51MoAPCgQ1LU05gDsWBbKKRwUs3AOYAaelxgsxgnpT4AjKOWkwAvsG2hIsAEJJUG3ARIwAZiwA2OWjuB7o8APbkjyBAB8YBp+AuACIsICwAPAAqAHzGHJi8AkIi4nScECxgNq4sACakkTCOzrAAytmEBq5g4QAKmdl5scj1WTm5MEwgUNy5ODCUvVCWolAdAPwaABQZbXnjpIO5w6O5AJRIsSFh4Usr3GOxxNOzjfkwrWcbiFuhEZft0XROAMau3MJWgy9wpOWulWq4Tg7gMzRgMwa7VIII811iU3iGESCgARHBUVJ0lC8jo1k5LN84IjTPgiKQKNQsQxmOQ2CYZMj+AoAORYABWjBwWFyLOpMjkCgAzABGAAMGm0mjWQA
Hover over the funcA call and it shows the expected argument type to be A & B
Related Issues:
TypeScript Version: 3.7.2
Search Terms: extends, type inference
Code
Key parts to look at in this code are the definition of
funcAwhich specifies the type of the argument to beA | B, but since it is typed asSlowboy<Payload>it goes through anextends undefinedcheck which changes the expected argument type offuncAfromA | BtoA & B.Expected behavior:
I expect the
extendskeyword to check if thePayloadtype extends undefined and if its the second case in which thePayloaddoesn't extend undefined, thePayloadtype should remain as applied in the definition offuncA, that isA | B.Actual behavior:
The
Payloadtype applied in the definition offuncAgets modified by theextendstype check fromA | BtoA & B.Is this the expected behavior of extends? Cause I don't think the type checks done by
extends undefinedshould stay after the check has already determined the type.Playground Link: https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=37&pc=3#code/FAFwngDgpgBAgjAvDA3sGGYEsDOA5KAdwC4YQAnAVygG51MoAPCgQ1LU05gDsWBbKKRwUs3AOYAaelxgsxgnpT4AjKOWkwAvsG2hIsAEJJUG3ARIwAZiwA2OWjuB7o8APbkjyBAB8YBp+AuACIsICwAPAAqAHzGHJi8AkIi4nScECxgNq4sACakkTCOzrAAytmEBq5g4QAKmdl5scj1WTm5MEwgUNy5ODCUvVCWolAdAPwaABQZbXnjpIO5w6O5AJRIsSFh4Usr3GOxxNOzjfkwrWcbiFuhEZft0XROAMau3MJWgy9wpOWulWq4Tg7gMzRgMwa7VIII811iU3iGESCgARHBUVJ0lC8jo1k5LN84IjTPgiKQKNQsQxmOQ2CYZMj+AoAORYABWjBwWFyLOpMjkCgAzABGAAMGm0mjWQA
Hover over the
funcAcall and it shows the expected argument type to beA & BRelated Issues: