typescript – 为什么分配给以前输入的变量会改变它的类型?

下面的第3行显示foo具有类型“a”|“b”,而在第7行,我们可以将foo与“b”进行比较:

1 let foo: "a"|"b";
2 
3 // error: Type '"c"' is not assignable to type '"a" | "b"'.
4 foo = "c";
5 
6 switch (foo) {
7     case "b": break; // legal comparison
8 }

这正是我所期待的.

但是,如果我将值“a”赋给foo,则会更改foo的类型,以便与“b”的比较不再有效:

1 let foo: "a"|"b";
2 
3 // this line changes the type of foo to '"a"', rather than '"a"|"b"'
4 foo = "a";
5 
6 switch (foo) {
7     // error: Type '"b"' is not comparable to type '"a"'
8     case "b": break; // illegal comparison!
9 }

到底发生了什么事?为什么为强类型变量赋值合法值会改变变量的类型?

最佳答案
正如其他人所说,TypeScript根据使用情况推断出类型.值得注意的是,它仅对Union类型(即Type1 | Type2)执行此操作

您可以将推断类型视为“时间点”类型.

let foo: "a"|"b";
foo = 'a'; // foo has inferred type 'a' but actual type is still 'a'|'b'
foo = 'b'; // We can still assign 'b', foo now has inferred type 'b'

在您的示例中,您得到:

// error: Type '"b"' is not comparable to type '"a"'

这是因为,在这个时间点,TypeScript知道foo是’a’类型而不是’b’类型,所以它会为你更新输入.

另一个例子是当你在相当不同的类型之间创建一个联合时:

let foo: string | number;
let bar: any = 'b';

foo = bar; // foo is now 'b' but has type string | number

foo.charAt(0); // Error: Property 'charAt' does not exist on type 'string | number' 

foo = 'a'; // foo now has inferred type of string

foo.charAt(0); // Can use string functions

foo = 24.123; // inferred type of number

foo.toFixed(0);

通过缩小/推断类型,我们现在可以使用仅在其中一个联合类型上可用的属性.

转载注明原文:typescript – 为什么分配给以前输入的变量会改变它的类型? - 代码日志