【问题标题】:Conditional/ternary result not type checked correctly in typescript?在打字稿中没有正确检查条件/三元结果?
【发布时间】: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'

【问题讨论】:

    标签: typescript typescript3.0


    【解决方案1】:

    您在flag 的注释中使用了anyany 根据定义可以分配给任何类型,也可以分配给任何类型。这意味着表达式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
    

    【讨论】:

    • 也是一般性的说明,如果你没有在你创建的接口上实现任何方法(比如只有属性定义的域对象,或者Java 中的 POJO)。它使您的class/type 更轻量级
    • @RobRombouts typeinterface 在这种情况下基本相同。 class 是另一种野兽。但是typeinterface 都是在编译时被擦除的类型(它们在类型系统中可以用它们做什么不同,但对于这个简单的示例,没有实际区别)
    • 感谢您为我澄清这一点,接口优于类型的优点是接口可以扩展,类型不能,对此感到困惑。出于这个原因,我总是使用界面。
    • @RobRombouts 类型可以用作接口的基本类型。他们不能自己扩展其他接口(尽管交叉点的模型足够好)。类型不能参与合并,从而关闭扩展途径。任何一个都适用于简单的情况,尽管我通常也更喜欢接口 :)
    猜你喜欢
    • 2020-12-25
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多