【问题标题】:Typescript prevent assertions to a super type打字稿防止对超类型的断言
【发布时间】:2019-06-20 13:20:02
【问题描述】:

是否有一个 Typescript 编译器标志使得以下代码无法编译?

interface A {
    key: number
}    
var B = {} as A;

对于 A 的类型扩展 B 的任何情况。如要编译上述代码,则必须使用双重断言:var B = {} as any as A;

此场景的其他一些示例,其中 A 扩展了 B,但允许断言 B 属于 A 类型。

class A {
    public key = 1;
}
var B = {} as A;               // Would not want to compile

declare var A: number | null;
var B = A as number;           // Would not want to compile

【问题讨论】:

    标签: typescript tsconfig


    【解决方案1】:

    我不确定你的最终目标是什么,但我可以解释一下为什么下面的代码可以编译:

    interface A {
        key: number
    }    
    var B = {} as A;
    

    TypeScript 有一个结构化的类型系统。您使用与任何其他类型兼容的空对象 {}。这就是为什么没有错误。

    不过,试着更好地描述你的目标。

    【讨论】:

    • 举这个例子declare var A: number | null; var B = A as number;这在打字稿中是允许的。这是一个断言而不是强制转换,因此在运行时,A 的值可能为 null,并且可以使用 B 引发运行时异常,假设它不能为 null。所以我问是否有一个 tsconfig 标志,如果 B 是 A 的子类型,则不允许尝试将 B 断言到 A。
    • 当您在示例中使用 as-assertion 时,您对 TypeScript 说:“不要尝试进行类型检查,因为我比您更清楚:A 是一个数字。”
    猜你喜欢
    • 2020-03-22
    • 2017-11-08
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多