如果我想在Javascript中以编程方式将一个属性分配给一个对象,我会这样做:

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

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

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

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


当前回答

我写过一篇文章探讨这个话题:

Typescript -在运行时增强对象及其类型

https://tech.xriba.io/2022/03/24/typescript-enhance-an-object-and-its-type-at-runtime/

也许你可以从Typescript概念中获得灵感,比如:

映射类型 通过as键重映射 十字路口类型

其他回答

为了保证类型是Object(即键值对),使用:

const obj: {[x: string]: any} = {}
obj.prop = 'cool beans'

或者一气呵成:

  var obj:any = {}
  obj.prop = 5;

你可以用这个:

this.model = Object.assign(this.model, { newProp: 0 });

可以通过将成员添加到现有对象

扩大类型(读取:扩展/专门化接口) 将原始对象转换为扩展类型 将成员添加到对象中

interface IEnhancedPromise<T> extends Promise<T> {
    sayHello(): void;
}

const p = Promise.resolve("Peter");

const enhancedPromise = p as IEnhancedPromise<string>;

enhancedPromise.sayHello = () => enhancedPromise.then(value => console.info("Hello " + value));

// eventually prints "Hello Peter"
enhancedPromise.sayHello();

既然你不能这样做:

obj.prop = 'value';

如果你的TS编译器和linter没有严格要求你,你可以这样写:

obj['prop'] = 'value';

如果你的TS编译器或linter是严格的,另一个答案将是类型转换:

var obj = {};
obj = obj as unknown as { prop: string };
obj.prop = "value";