当前位置: 首页 > 知识库问答 >
问题:

javascript - typescript如何解决对象动态获取属性并调用方法的类型定义?

茹建茗
2023-11-02

如题
demo 如下:

var obj = {    aaa:{        init:function(){            console.log('aaa')        }     },     bbb:{        init:function(){            console.log('bbb')        }     }}function fn(type:string){    obj[type].init()}fn('aaa')

报错 类型“("string")[]”上不存在属性“init”
如何定义类型,可以保证这里正常调用?

共有2个答案

凤晨朗
2023-11-02

可以通过 typeof 获取对象 obj 的类型,再通过 keyof 获取 obj 类型中所有 key 的集合,进而确认 obj[type] 的类型。

var obj = {  aaa: {    init: function () {      console.log("aaa");    },  },  bbb: {    init: function () {      console.log("bbb");    },  },};function fn(type: keyof typeof obj) {  obj[type].init();}fn("aaa");

希望有所帮助!

章永安
2023-11-02

这是一个很好的问题,你正在尝试在 TypeScript 中解决动态对象属性的类型定义问题。虽然 TypeScript 对于对象属性的类型检查非常严格,但是你仍然可以通过使用 "any" 类型来绕过这个问题。

在你的代码中,你可以将 obj 的类型定义为 any,这样就可以避免报错 类型“("string")[]”上不存在属性“init”

下面是修改后的代码:

var obj: any = {    aaa:{        init:function(){            console.log('aaa')        }     },     bbb:{        init:function(){            console.log('bbb')        }     }}function fn(type:string){    obj[type].init()}fn('aaa')

然而,使用 "any" 类型可能会带来其他的类型安全问题。一个更好的解决方案是使用接口(Interface)来定义 obj 的类型。你可以创建一个接口,该接口包含以字符串为键的对象,这些对象都有 init 方法。这样,你就可以在 obj 变量上使用这个接口,而不会失去类型安全。

下面是一个使用接口的示例:

interface IInitable {    init: Function;}var obj: { [key: string]: IInitable } = {    aaa:{        init:function(){            console.log('aaa')        }     },     bbb:{        init:function(){            console.log('bbb')        }     }}function fn(type:string){    obj[type].init()}fn('aaa')

在这个示例中,IInitable 接口定义了一个有 init 方法的对象。然后,obj 的类型被定义为具有这个接口的对象的映射。这样,你就可以在 obj 上使用键(字符串)来调用 init 方法,而不会出现类型错误。

 类似资料:
  • 问题内容: 我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想: 有没有人为此提供脚本或知道内置的方式来执行此操作?我不需要递归,也不需要合并函数,只需合并平面对象上的方法即可。 问题答案: ECMAScript 2018标准方法 您将使用对象传播: 现在是和的并集。中的属性将覆盖中的属性。 这也是此语法的MDN文档。如果您正在使用babel,则需要babel-plugi

  • 我希望data是否必传由A[T]是否有必传属性决定。如何做呢?

  • 我想设计一个这样的 TS 类型,但是不知道该如何设计,就是一个数组类型,数组的每一项都是一个对象,对象有两个属性,第一个属性是 就像这样使用React 组件,第二个对象是需要传递给该组件的属性,希望可以保持有 TS 的类型检查应该如何设计, 使用时就像这样 之前这么设计过这个类型,数组中只传入一项没有问题,但是假如传入多项就会有类型不匹配

  • 问题内容: 说我有一个对象: 我想用其属性的子集创建一个新对象。 我该如何实现? 问题答案: 使用对象分解和属性速记 来自Philipp Kewisch: 这实际上只是一个即时调用的匿名函数。所有这些都可以在MDN 的“ 解构分配”页面上找到。这是扩展形式

  • 本文向大家介绍如何获取JavaScript对象属性的子集?,包括了如何获取JavaScript对象属性的子集?的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的对象- 以下是仅获取子集的代码- 示例 要运行以上程序,您需要使用以下命令- 在这里,我的文件名为demo120.js。 输出结果 这将产生以下输出-

  • 说我有对象: 我想用它的属性的子集来制作一个新的对象。 我怎样才能做到这一点?