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

如何从TypeScript中的未知类型对象中读取密钥,typescript,structural-typing,Typescript,Structural Typing,以下代码段将不会使用typescript@4.0.2 const foo:unknown={bar:'baz'} if(foo&&typeof foo==='object'&&bar'在foo中){ console.log(foo.bar) } tsc错误正在发生 Property 'bar' does not exist on type 'object'. 如何让tsc相信foo可以在没有显式强制转换的情况下拥有任意命名的键 这里有一个游乐场链接 看一看。您可以通过使用某个元素来检查该元素

以下代码段将不会使用
typescript@4.0.2

const foo:unknown={bar:'baz'}
if(foo&&typeof foo==='object'&&bar'在foo中){
console.log(foo.bar)
}
tsc错误正在发生

Property 'bar' does not exist on type 'object'.
如何让
tsc
相信foo可以在没有显式强制转换的情况下拥有任意命名的键

这里有一个游乐场链接

看一看。您可以通过使用某个元素来检查该元素是否属于某个类型:

type Bar = {bar: string};

function isBar(element: unknown): element is Bar  {
  return (element as Bar).bar !== undefined;
}

const foo: unknown = {bar: 'baz'}
if (isBar(foo)) {
  console.log(foo.bar)
}

类型
未知
是类型安全的,因此解决此问题的一种方法是将对象
foo
强制转换为
任何
或将
作为属性的接口

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

console.log((foo as any).bar);
或者


我建议您的
isBar
检查
bar
属性是否实际上是一个
字符串,而不仅仅是定义的。否则,您会遇到诸如
const badBar:unknown={bar:123}
之类的问题。我的建议看起来像是,我同意。谢谢你的提示。没有明确的演员阵容是不可能的。如果您仍然需要,则需要使用typescript忽略!如果有一种不用强制转换就可以绕过它的方法,那么没有人会相信typescript,typescript从一开始就不存在!
const foo: unknown = {bar: 'baz'};

interface HasBar {
   bar: string;
}

console.log((foo as HasBar).bar);