0

以下打字稿代码会导致错误(打字稿 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+9FlzAvO1X​​QNxIAvkiShIMAELQApgA8ALjIB2AExjxkaDDnyFGHaDwZkBwpEA

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

4

1 回答 1

0

看起来 'foo' 被推断为一个字符串,它允许B.foobar被推断为一个字符串,然后与父类成员的类型冲突A.foobar

以下作品,从我的理解水平来看,它不会进行任何类型转换:

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

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

以下也有效,它强制打字稿推断B.foobarfromA.foobar而不是字符串值的类型。

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

class B extends A {
    constructor() {
        super();
        this.foobar = 'foo';
    }
}
于 2020-04-12T01:14:55.073 回答