对象字面量的 TS 接口
Posted
技术标签:
【中文标题】对象字面量的 TS 接口【英文标题】:TS interface for object literal 【发布时间】:2021-08-24 19:48:37 【问题描述】:我已经厌倦了为通用对象编写Record<string, any>
接口。因此,我从 SO 上的here 获得了以下解决方案,用于定义具有动态键的对象的接口,如下所示
interface object
[key: string]: any;
但是,当我使用它时,我遇到了这个错误:
第 2 行:“对象”类型上不存在属性“错误”。
1| (data: object) =>
2| if(data.errors)
3| console.error(data);
4|
5|
请帮忙。
【问题讨论】:
【参考方案1】:TypeScript 已经有一个 object
类型,所以你不能使用 object
作为你的类型名称。 (您的 interface
声明 like I do here 应该会出错。)
只需使用不同的名称:
interface BasicObject
[key: string]: any;
const fn = (data: BasicObject) =>
if (data.errors)
console.error(data);
;
Playground link
(如果您愿意,也可以将类型定义为type BasicObject = Record<string, any>;
。)
【讨论】:
天啊,这太愚蠢了。不允许对象作为标识符的原因是什么? @AakashVerma - 因为 TypeScript 已经有了一个。允许你以不同的方式重新定义它是自找麻烦。 我同意。您可以将object
的链接作为内置类型发布吗?我无法以某种方式找到它。以前也没见过。
非常感谢。我的 linter 没有抛出任何错误。我在想我会错过什么。
@AakashVerma - 嗯。听起来 TypeScript 本身并没有针对代码运行?只是知道如何解析 TypeScript 的东西?我想知道是否可能是 TS 没有阻止你这样做,但根据操场,甚至 v3.3.3 都这样做了......快乐编码!【参考方案2】:
替代解决方案:使用:any
,而不是创建与any
完全相同的接口。
我知道建议使用显式类型并避免使用any
。但既然您想要相同的功能,您不妨使用广为人知的关键字,而不是为此创建自己的界面。
显然,使用any
仅在您不需要界面上的其他命名和类型属性时才有效,但从问题来看,您似乎不需要。
【讨论】:
以上是关于对象字面量的 TS 接口的主要内容,如果未能解决你的问题,请参考以下文章
ES6——字面量的增强解构let/const块级作用域暂时性死区