如何在TypeScript中为对象动态分配属性?

彼得·奥尔森

如果我想以编程方式将属性分配给Javascript中的对象,则可以这样做:

var obj = {};
obj.prop = "value";

但是在TypeScript中,这会产生一个错误:

类型“ {}”的值不存在属性“ prop”

我应该如何在TypeScript中为对象分配任何新属性?

阿卡什·库里安·何塞(Akash Kurian Jose)

索引类型

可以将表示objany,但这违背了使用打字稿的全部目的。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}whereKeysType泛型的命名别名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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章