如果我想在Javascript中以编程方式将一个属性分配给一个对象,我会这样做:
var obj = {};
obj.prop = "value";
但在TypeScript中,这会产生一个错误:
属性“prop”在类型为“{}”的值上不存在
我应该如何在TypeScript中分配任何新属性给对象?
如果我想在Javascript中以编程方式将一个属性分配给一个对象,我会这样做:
var obj = {};
obj.prop = "value";
但在TypeScript中,这会产生一个错误:
属性“prop”在类型为“{}”的值上不存在
我应该如何在TypeScript中分配任何新属性给对象?
当前回答
我倾向于把任何放在另一边,即var foo:IFoo = <任何>{};所以这样的东西仍然是类型安全的:
interface IFoo{
bar:string;
baz:string;
boo:string;
}
// How I tend to intialize
var foo:IFoo = <any>{};
foo.bar = "asdf";
foo.baz = "boo";
foo.boo = "boo";
// the following is an error,
// so you haven't lost type safety
foo.bar = 123;
或者你可以将这些属性标记为可选:
interface IFoo{
bar?:string;
baz?:string;
boo?:string;
}
// Now your simple initialization works
var foo:IFoo = {};
在网上试试
其他回答
为Angular扩展@jmvtrinidad解决方案,
当使用已经存在的类型化对象时,这是添加新属性的方法。
let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
现在如果你想在html端使用otherProperty,这是你需要的:
<div *ngIf="$any(user).otherProperty">
...
...
</div>
Angular编译器将$any()视为转换为any类型,就像TypeScript中使用a <any>或任意类型转换一样。
唯一完全类型安全的解决方案是这个,但是有点啰嗦,并且迫使您创建多个对象。
如果你必须先创建一个空对象,那么从这两个解决方案中选择一个。记住,每次你使用as,你就失去了安全。
安全解决方案
对象类型在getObject中是安全的,这意味着对象。A的类型为字符串| undefined
interface Example {
a: string;
b: number;
}
function getObject() {
const object: Partial<Example> = {};
object.a = 'one';
object.b = 1;
return object as Example;
}
短期解决方案
对象类型在getObject中是不安全的,这意味着对象。即使在赋值之前,A的类型也是string。
interface Example {
a: string;
b: number;
}
function getObject() {
const object = {} as Example;
object.a = 'one';
object.b = 1;
return object;
}
当对象具有特定类型时,此解决方案非常有用。比如从其他源获取对象时。
let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
若要保留先前的类型,请将对象临时转换为any
var obj = {}
(<any>obj).prop = 5;
新的动态属性只有在使用强制转换时才可用:
var a = obj.prop; ==> Will generate a compiler error
var b = (<any>obj).prop; ==> Will assign 5 to b with no error;
我写过一篇文章探讨这个话题:
Typescript -在运行时增强对象及其类型
https://tech.xriba.io/2022/03/24/typescript-enhance-an-object-and-its-type-at-runtime/
也许你可以从Typescript概念中获得灵感,比如:
映射类型 通过as键重映射 十字路口类型