【问题标题】:TypeScript: how do I initialize members of a class using setters without using a definite assignment assertion?TypeScript:如何在不使用明确赋值断言的情况下使用 setter 初始化类的成员?
【发布时间】:2018-12-16 20:14:52
【问题描述】:

以下 TypeScript 代码在启用 strictNullChecksstrictPropertyInitialization 的情况下无法编译:

class SampleClass {
    private _foo: string;

    constructor(foo: string) {
        this.foo = foo;
    }

    public get foo() {
        return this._foo;
    }

    public set foo(foo: string) {
        this._foo = foo;
    }
}

编译器抱怨“属性 '_foo' 没有初始化器,并且没有在构造函数中明确分配。”

我可以通过向_foo 添加明确的赋值断言来解决此问题,但我不明白为什么需要这样做。构造函数调用foo 的设置器,然后设置_foo。这是一个错误,还是我不明白的地方?

在撰写本文时,我使用的是最新版本的 TypeScript (3.2.1)。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这是一个错误

    不,您已经声明自己正在运行严格模式的打字稿。

    有什么我不明白的地方

    这段代码:

    private _foo: string;
    

    没有初始化器意味着当你的类实例化时,你的类型是 _foo undefined,但是你已经声明了类型 string,而不是 string | undefined。因此,您可以执行以下操作之一:

    private _foo?: string;
    // or
    private _foo: string | undefined;
    

    您将能够避免对该属性进行初始化。

    该修改将导致您班级中的其他相关修改。

    【讨论】:

    • 但是_foo肯定是在构造函数中赋值的。构造函数调用foo 的setter,它为_foo 赋值。
    • @MichaelKourlas 虽然你是对的,但 Typescript 根本不看这样的东西。这不关它的事。也许将来他们会添加这样的功能(怀疑),但目前这种推断器不存在。只需阅读文档,您就会了解 TS 的功能。
    • TypeScript can't do this 看起来您是正确的,尽管在我看来这似乎是一个重大限制。 AFAIK,TypeScript 在其他上下文中进行类似的控制流分析;很遗憾他们不能或不会在这里做。
    • @MichaelKourlas 哦,相信我在 TS 中还有很多更重要的问题和错误。但是如果有的话,仍然没有很多好的替代品。
    【解决方案2】:

    不幸的是,看起来这是一个known issue,确实可以使用明确的赋值断言。

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2022-10-02
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多