如题
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”
如何定义类型,可以保证这里正常调用?
可以通过 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");
希望有所帮助!
这是一个很好的问题,你正在尝试在 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。 输出结果 这将产生以下输出-
说我有对象: 我想用它的属性的子集来制作一个新的对象。 我怎样才能做到这一点?