抽象类成员值的文字字符串类型推断

时间:2020-04-12 01:14:55

标签: typescript class inheritance member

以下打字稿代码导致错误(打字稿v3.8.3)。为什么?

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    public foobar = 'foo';  // --> Type 'string' is not assignable to type '"foo" | "bar"'
}

游乐场:https://www.typescriptlang.org/play?#code/MYGwhgzhAECC0G8BQ1XQA4FcBGICWw0AZgPYnZgBOAXNAOSkl3QA+9FlzAvO1XQNxIAvkiShIMAELQApgA8ALjIB2AExjxkaDDnyFGHaDwZkBwpEA

我在下面为这个问题提供了答案,但是我很高兴听到实现相同目的的替代方法,这些替代方法不需要在子类中编写构造函数或复制类型定义。

1 个答案:

答案 0 :(得分:0)

似乎'foo'被推断为字符串,这允许B.foobar被推断为字符串,然后与父类成员A.foobar的类型冲突。

以下作品,根据我的理解,不会进行任何类型转换:

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    public foobar: 'foo' | 'bar' = 'foo';
}

以下内容也有效,它迫使打字稿从B.foobar推断出A.foobar的类型而不是字符串值。

class A {
    public foobar: 'foo' | 'bar' = 'bar';
}

class B extends A {
    constructor() {
        super();
        this.foobar = 'foo';
    }
}