Typescript: Returned tuples don't match compatible types when using function union types

Created on 7 Jan 2020  路  7Comments  路  Source: microsoft/TypeScript

The first error is especially odd.

TypeScript Version: 3.7.x-dev.20200104


Search Terms:

Code

type C1 = (a: 1) => [0];
type C2 = (a: 2) => [number];
type C3 = (a: 3) => undefined;

declare function f(a: C1 | C3): void;
f(() => [0]);
declare function g(a: C2 | C3): void;
g(() => [0]);

Expected behavior:
pass
Actual behavior:
Type 'number' is not assignable to type '0'.(2322)
Property '0' is missing in type 'number[]' but required in type '[number]'.(2741)
Playground Link: http://www.typescriptlang.org/play/index.html?ts=3.8.0-dev.20200104&ssl=1&ssc=1&pln=8&pc=14#code/C4TwDgpgBAwgjFAvFAFAQwFxTgSiQPigG0AGAXQG4AoUSWAJiVUynr0UKIDsBXAWwBGEAE6Ua4aDADMTdFintCPLgBMIAMwCWXCCupU1AYwA2aYdHXLDwTQHsuUdXNgIAPrAVYAbrc16qTiiKxOQ41Eam5o5WNvZQAObOMIzu0jjevv6JQQQhZGFAA

Related Issues:

Bug

All 7 comments

Duplicate of #241

I'm really not sure why you could think so. The compiler just chooses a type. Doesn't measure the variance.

The return type of () => [0] is widened to number[], despite contextual type information about the expected parameter of f() and g().

Then can you explain why the following code won't be an error?

declare function f(a: C1): void;
f(() => [0]);

Magic? (No, I鈥檓 not sure.)

Not sure which direction we should go on this one.

@jcalz Your stupid comments are really useless and annoying. Don't touch my issues. I'm not posting issues to talk to you.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

rwyborn picture rwyborn  路  210Comments

xealot picture xealot  路  150Comments

blakeembrey picture blakeembrey  路  171Comments

Gaelan picture Gaelan  路  231Comments

fdecampredon picture fdecampredon  路  358Comments