如果我想以编程方式将属性分配给Javascript中的对象,则可以这样做:
var obj = {};
obj.prop = "value";
但是在TypeScript中,这会产生一个错误:
类型“ {}”的值不存在属性“ prop”
我应该如何在TypeScript中为对象分配任何新属性?
可以将表示obj
为any
,但这违背了使用打字稿的全部目的。obj = {}
暗示obj
是一个Object
。将其标记为any
没有任何意义。为了实现期望的一致性,可以如下定义接口。
interface LooseObject {
[key: string]: any
}
var obj: LooseObject = {};
或使其紧凑:
var obj: {[k: string]: any} = {};
LooseObject
可以接受带有任何字符串的字段作为键并any
输入类型作为值。
obj.prop = "value";
obj.prop2 = 88;
该解决方案的真正优雅之处在于,您可以在界面中包含类型安全字段。
interface MyType {
typesafeProp1?: number,
requiredProp1: string,
[key: string]: any
}
var obj: MyType ;
obj = { requiredProp1: "foo"}; // valid
obj = {} // error. 'requiredProp1' is missing
obj.typesafeProp1 = "bar" // error. typesafeProp1 should be a number
obj.prop = "value";
obj.prop2 = 88;
Record<Keys,Type>
实用程序类型更新(2020年8月):@transang在评论中提出了这一点
Record<Keys,Type>
是打字稿中的实用程序类型。对于不知道属性名称的键值对,这是一种更清洁的替代方法。值得注意的是,这Record<Keys,Type>
是{[k: Keys]: Type}
whereKeys
和Type
泛型的命名别名。IMO,这在这里值得一提
为了比较,
var obj: {[k: string]: any} = {};
变成
var obj: Record<string,any> = {}
MyType
现在可以通过扩展记录类型进行定义
interface MyType extends Record<string,any> {
typesafeProp1?: number,
requiredProp1: string,
}
虽然这回答了原始问题,但@GreeneCreations在这里给出的答案可能会为如何解决该问题提供另一种观点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句