对象字面量的 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 接口的主要内容,如果未能解决你的问题,请参考以下文章

JS对象基本类型和字面量的区别

js 对象字面量

ES6——字面量的增强解构let/const块级作用域暂时性死区

Objective-C 对象字面量的隐式布尔转换总是计算为真 ios

js对象字面量的属性名你加引号吗

JS对象字面量