打字稿:如何访问默认的不存在的对象属性?

时间:2020-03-18 08:59:19

标签: typescript

如何访问默认的不存在的对象属性?

在此示例中,打字稿抱怨fooBar[foo]- Element implicitly has an 'any' type because expression of type '"fooBar"' can't be used to index type '{ readonly foo: "bar"; readonly bar: "foo"; }'. Property 'fooBar' does not exist on type '{ readonly foo: "bar"; readonly bar: "foo"; }'

实现此功能的打字稿方式是什么?

const fooBar = {
    foo: 'bar',
    bar: 'foo'
} as const

const foo: 'foo' | 'fooBar' = 'fooBar';

const op: 'foo' | "bar" | 'default' = fooBar[foo] || 'default';

Playground Link

1 个答案:

答案 0 :(得分:0)

foo的值为“ foo”或“ fooBar”,因此当您说fooBar[foo]时,编译器会抱怨,因为“ fooBar”不在keyof typeof fooBar中。

使编译器停止抱怨的唯一方法是像这样撒谎:

type FooBar = typeof fooBar
const op: FooBar[keyof FooBar] | 'default' =
    fooBar[foo as keyof FooBar] || 'default';

同样,这是一个谎言,因为在您的情况下,您知道foo是“ foo”或“ fooBar”,并且您知道“ fooBar”不是fooBar中的键之一。