打字稿为“对象”分配特定类型而不是“任何”

Posted

技术标签:

【中文标题】打字稿为“对象”分配特定类型而不是“任何”【英文标题】:Typescript assign 'Object' a specific type instead of 'any' 【发布时间】:2021-03-17 21:02:15 【问题描述】:

由于 --strict_checks 和 typescript eslint 检查,我正在尝试修复我的代码中的一些新错误。下面的代码示例用于我解释的所有内容。假设我有一个对象 a,我想直接将其指定为地图以解决一些错误。我不能使用关键字“任何”。这就是我想要做的:

isEquivalent(a: Object, b: Object): boolean 
   const aObject: [index: string]: Object = a;
   const bObject: [index: string]: Object = b;

使用实际代码 sn-p 链接到 typescript playground:here 但这会引发错误:

错误 TS2322:类型 'Object' 不可分配给类型 ' [index: string]: Object; '。 “对象”类型可分配给极少数其他类型。您的意思是改用“任何”类型吗? “对象”类型中缺少索引签名。

谁能指出我指定对象的类型的解决方案,而不使用“任何”?或者如果这不可能,请告诉我。

【问题讨论】:

进行了您要求的更改。 【参考方案1】:

const aObject: [index: string]: Object = a;aObject 类型)分配给aObject[index: string]: Object 类型,一个具有字符串属性名称和Object 属性值的对象)。但是 Object[index: string]: Object 的赋值不兼容,所以 TypeScript 会给你这个错误。

如果你想强制它,你可以做一个type assertion:

const aObj = a as [index: string]: Object;

Updated playground link

请注意,类型断言大多会禁用 TypeScript 的类型检查。调用者可以传入a: 42,它不是[index: string]: Object,TypeScript 会允许它,因为你说参数只是Object,但是你把它当作@ 987654335@.

有时这是合适的,但您可以考虑为参数指定类型[index: string]: Object,而不是在函数中使用类型断言。这样,TypeScript 可以确保只传入正确类型的对象。

【讨论】:

以上是关于打字稿为“对象”分配特定类型而不是“任何”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用打字稿为反应测试库设置智能感知

打字稿不正确的分配/映射到强类型对象[关闭]

打字稿中的通用对象类型

是否可以强制打字稿使用来自definitelyTyped 的类型而不是本机库类型?

打字稿:与基本类型平行的自定义类型被忽略

打字稿:如何根据对象键/值类型在 ES6 映射中创建条目