为什么TypeScript不对符号属性使用类型缩小?

时间:2019-11-26 17:37:13

标签: typescript

TypeScript似乎不会缩小符号属性的类型。例如:

const bar = Symbol('bar');

class Foo {
    [bar]: string | undefined;
    'baz': string | undefined;
}

function getBarLength(f: Foo) {
    if (f[bar] === undefined) {
        throw new Error('Expected bar to be defined');
    }
    return f[bar].length; // ERROR(2532): Object is possibly undefined
}

function getBazLength(f: Foo) {
    if (f['baz'] === undefined) {
        throw new Error('Expected baz to be defined');
    }
    return f['baz'].length; // No error
}

In the playground

我想知道这是否是设计使然?如果是这样,原因是什么?

1 个答案:

答案 0 :(得分:2)

我认为这是您必须使用变量来保留符号值并因此必须使用该变量来访问符号属性(而不是直接访问属性名称)的副作用,例如,它具有类似的困难使用对象属性表示法时,即使字符串为class X { constructor (e) { let someVar = e; } SomeMethod () { console.log(this.someVar); } } ,也需要使用字符串属性:

const

Playground Link

您可以通过以下方法解决此问题:将要测试的值分配给一个临时变量,然后对该变量执行类型缩小,而不是直接访问该属性两次:

const abc = 'abc' as const;

class Foo {
    [abc]: string | undefined;
}

function getAbcLength(f: Foo) {
    if (f[abc] === undefined) {
        throw new Error('Expected abc to be defined');
    }
    return f[abc].length; // ERROR(2532): Object is possibly undefined
}

Playground Link