【发布时间】:2019-10-07 14:32:26
【问题描述】:
type User = {
name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1; // hope error
为什么list1可以为1,为什么不报错:Type '1' is not assignable to type 'User'
【问题讨论】:
type User = {
name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1; // hope error
为什么list1可以为1,为什么不报错:Type '1' is not assignable to type 'User'
【问题讨论】:
您在flag 的注释中使用了any。 any 根据定义可以分配给任何类型,也可以分配给任何类型。这意味着表达式flag ? flag : 1 的结果将是any(因为三元表达式的结果之一是any,所以表达式的类型是any | 1,它将减少到any)。
一般避免any。如果您在编译时真的不知道类型,请使用unknown。在这种情况下,删除注释会产生预期的错误:
type User = {
name: string;
};
const flag = false; // no annotation
let list1: User;
list1 = flag ? flag : 1; // err
【讨论】:
class/type 更轻量级
type 和 interface 在这种情况下基本相同。 class 是另一种野兽。但是type 和interface 都是在编译时被擦除的类型(它们在类型系统中可以用它们做什么不同,但对于这个简单的示例,没有实际区别)