【问题标题】:How to prevent Typescript class member from changing type?如何防止 Typescript 类成员更改类型?
【发布时间】:2021-09-14 10:45:34
【问题描述】:

几年前我一直在使用 Typescript,但我仍然发现它的魔力。

我想知道为什么一个类成员可以在运行时更改类型,尽管它已在代码中定义为另一个?

我有一个小例子:

class TestClass {
    myArray: Array<number>

    constructor(map: any) {
        this.myArray = map.TEST
    }
}

const map1 = { TEST: "[]" }
const test1 = new TestClass(map1)
console.log(typeof test1.myArray)

const map2 = { TEST: [] }
const test2 = new TestClass(map2)
console.log(typeof test2.myArray)

然后输出:

[LOG]: "string"
[LOG]: "object"

我了解由于构造函数参数中的any,编译器不会防止map 的错误类型或未定义值。

但我不明白为什么typeof 类成员取决于我们分配的值的类型。为什么不尝试进行强制转换以匹配声明的类成员类型?

以及随后的问题:如何确定编码时不会发生这种情况?鉴于我们并不确切知道地图对象成员的类型。

操场上的例子:https://www.typescriptlang.org/play?#code/MYGwhgzhAEAqCmEAuBhcVoG8BQ0-QFsBPAQQCcywiAuacyogHgDsBXAgI3jID5td8wAPbNkZVsCRCyACgJgADrTDMiASiwD8+JAAsAlhAB0xelWgBeQoqOwAogGVYW6AF9s77MNFJrCgIyWWHCOsLQARADaALrhbl4iyNBIiEiBVszwAO5wqWiQEHKK-moJokIg8EYgQgDmMkhECvBCAGbJqf4mpBRUpWVJ8goATEGYIU60MfHeSSnIoxnZucj5UEUjpbMVVTX1jc1tHQvdZupAA

谢谢

【问题讨论】:

    标签: typescript


    【解决方案1】:

    但我不明白为什么类成员的 typeof 取决于我们分配的值的类型。为什么不尝试进行强制转换以匹配声明的类成员类型?

    您使用的 typeofJavaScript's typeof,而不是 TypeScript(仅适用于操作数是类型而不是值的地方)。它告诉您属性中实际值的类型,在您的第一个示例中为 string,在您的第二个示例中为 object(因为数组是对象,而 typeof 确实是有限的)。

    当你执行this.myArray = map.TEST 时,由于map 的类型是any,TypeScript 允许它,因为你已经明确mapany,它几乎绕过了所有类型检查检查——TypeScript 假设您知道自己在做什么。如果 map.TESTthis.myArray 的赋值不兼容,那么您最终会导致 TypeScript 认为 this.myArray 指的是一个数组,但该属性在运行时实际上是一个字符串。

    这个故事的寓意是:如果可以避免,请不要使用any,如果无法避免,请在分配给您已指定类型的事物之前对值进行运行时验证(比如this.myArray)。

    【讨论】:

    • 好的,谢谢。但后来我想知道为什么接受像const someVar: Array&lt;number&gt; = "string" 这样的事情,因为最后它是在构造函数中完成的,当映射包含一个字符串而不是一个数组时?这发生在:typescriptlang.org/play?#code/…
    • @MicCode - 我刚才添加到答案中,并认为我碰巧回答了这个问题。基本上:因为any。请注意const someVar: Array&lt;number&gt; = "string"; 不起作用,因为"string" 的类型不是any。但是如果你添加as anyit's allowed
    • 抱歉,我没有看到您的编辑。好的,所以这是允许的,因为我理解的任何内容。是否有任何打字稿配置可以强制编码人员不使用任何/这是一个好习惯吗?如果 typeof 在 typescript 中还不够,如何确保良好的 value 类型?实例? (但它是否适用于原语?)
    • 我认为没有像示例中那样阻止 explicit any 的 TypeScript 设置。 noImplicitAny 可以防止隐式使用。您必须编写代码进行检查,这当然取决于您的价值。但在这种情况下,根本不要使用any
    • 好的,非常感谢您的回答,我会尽可能坚持“避免使用任何”。
    猜你喜欢
    • 2021-11-02
    • 2019-10-13
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2019-12-29
    • 2011-09-24
    相关资源
    最近更新 更多