如何从 TypeScript 中的未知类型对象读取密钥

weg*_*gry 1 structural-typing typescript

以下代码片段无法使用typescript@4.0.2.

const foo: unknown = {bar: 'baz'}

if (foo && typeof foo === 'object' && 'bar' in foo) {
  console.log(foo.bar)
}
Run Code Online (Sandbox Code Playgroud)

tsc 错误是

Property 'bar' does not exist on type 'object'.
Run Code Online (Sandbox Code Playgroud)

如何确信tscfoo 可以拥有任意命名的键而无需显式强制转换?

这是游乐场链接。https://www.typescriptlang.org/play?#code/MYewdgzgLgBAZiEAuGBXMBrMIDuYYC8MA3gEYCGATigOQUBeNAvgFAsCWcMAFAiDADIBMKAE8ADgFMQXPoQJEaIUgCtJwKDUHC6VLe3x8AlCRYwYoSCAA2kgHTWQAc16I7FSkZZMgA

Bhu*_*han 7

类型unknown是类型安全的,因此解决此问题的一种方法是将对象强制转换foo为具有属性的any接口。bar

const foo: unknown = {bar: 'baz'};

console.log((foo as any).bar);
Run Code Online (Sandbox Code Playgroud)

或者,

const foo: unknown = {bar: 'baz'};

interface HasBar {
   bar: string;
}

console.log((foo as HasBar).bar);
Run Code Online (Sandbox Code Playgroud)