【问题标题】:TypeScript not recognising initialising via a setterTypeScript 无法识别通过 setter 进行的初始化
【发布时间】:2020-05-09 01:23:22
【问题描述】:

在以下示例中:

class Foo {
    private _bar: number;

    constructor(bar: number) {
        this.bar = bar;
    }

    set bar(bar: number) {
        this._bar = bar;
    }
}

TypeScript 抱怨

属性“_bar”没有初始化器,也没有在构造函数中明确赋值。

我假设 TypeScript 足够智能,可以检测到属性是通过 setter 设置的,但显然不是。

我可以通过更改构造函数中的赋值来设置this._bar 本身来解决这个问题,但是对于一个类来说使用它自己的getter 和setter 是一种很好的做法,这个修复会绕过它。有没有其他方法可以解决这个问题?

【问题讨论】:

  • 你是否使用了this._bar!: number,而不是this._bar: number,这告诉TypeScript你将在构造函数以外的地方定义这个变量,如果这个变量可能被定义,也可能没有被定义,那么@ 987654325@,会更好地使用语法。

标签: typescript


【解决方案1】:

如果编译器无法确定某个属性已正确初始化,并且您确定,您可以通过属性声明上的definite assignment assertion modifier (!) 告诉编译器:

private _bar!: number; // definitely set in constructor, no error now

显然,如果编译器可以为您验证这一点会更好,但发生这种情况的希望很小,因为初始化发生在相当于函数/方法调用的内部,并且编译器基本上假定此类调用不会改变任何状态。这个假设并不总是正确的(例如,它现在是错误的)但它是务实的; 完全分析函数/方法调用的所有副作用是不可能实现的(它本质上是模拟在所有可能的输入上运行的程序),因此任何分析都必须是启发式的,并且必然不完整或不健全。请参阅 microsoft/TypeScript#9998 了解有关权衡取舍的冗长讨论。

好的,希望对您有所帮助;祝你好运!

Playground link to code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多