Pet*_*son 291 typescript
如果我想以编程方式将属性分配给Javascript中的对象,我会这样做:
var obj = {};
obj.prop = "value";
Run Code Online (Sandbox Code Playgroud)
但在TypeScript中,这会产生错误:
类型"{}"的值不存在属性"prop"
我应该如何在TypeScript中为对象分配任何新属性?
Aka*_*ose 341
有可能表示obj为any,但这违背了使用打字稿的整个目的.obj = {}暗示obj是一个Object.将其标记为any没有意义.为了实现所需的一致性,可以如下定义接口.
interface LooseObject {
[key: string]: any
}
var obj: LooseObject = {};
Run Code Online (Sandbox Code Playgroud)
或者使其紧凑:
var obj: {[k: string]: any} = {};
Run Code Online (Sandbox Code Playgroud)
LooseObject可以接受任何字符串作为键并any键入值的字段.
obj.prop = "value";
obj.prop2 = 88;
Run Code Online (Sandbox Code Playgroud)
此解决方案的真正优雅之处在于您可以在界面中包含类型安全字段.
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;
Run Code Online (Sandbox Code Playgroud)
Crw*_*wth 77
或者一气呵成:
var obj:any = {}
obj.prop = 5;
Run Code Online (Sandbox Code Playgroud)
bas*_*rat 57
我倾向于放在any另一边,即var foo:IFoo = <any>{};所以像这样的东西仍然是类型安全的:
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;
Run Code Online (Sandbox Code Playgroud)
或者,您可以将这些属性标记为可选:
interface IFoo{
bar?:string;
baz?:string;
boo?:string;
}
// Now your simple initialization works
var foo:IFoo = {};
Run Code Online (Sandbox Code Playgroud)
jmv*_*dad 40
当您的对象具有特定类型时,此解决方案很有用.就像获取对象到其他来源时一样.
let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
Run Code Online (Sandbox Code Playgroud)
Ang*_* R. 34
虽然编译器抱怨它仍然应该根据需要输出它.但是,这将有效.
var s = {};
s['prop'] = true;
Run Code Online (Sandbox Code Playgroud)
Gre*_*ons 25
我很惊讶没有一个答案引用 Object.assign,因为这是我在考虑 JavaScript 中的“组合”时使用的技术。
它在 TypeScript 中按预期工作:
interface IExisting {
userName: string
}
interface INewStuff {
email: string
}
const existingObject: IExisting = {
userName: "jsmith"
}
const objectWithAllProps: IExisting & INewStuff = Object.assign({}, existingObject, {
email: "jsmith@someplace.com"
})
console.log(objectWithAllProps.email); // jsmith@someplace.com
Run Code Online (Sandbox Code Playgroud)
好处
any类型&声明类型时的表示objectWithAllProps),它清楚地表明我们正在即时(即动态地)组合一个新类型需要注意的事项
existingObject保持不变,因此没有email属性。对于大多数函数式程序员来说,这是一件好事,因为结果是唯一的新变化)。Avi*_*viw 24
另一个选择是将属性作为集合访问:
var obj = {};
obj['prop'] = "value";Run Code Online (Sandbox Code Playgroud)
小智 23
迟到了,但简单的答案
let prop = 'name';
let value = 'sampath';
this.obj = {
...this.obj,
[prop]: value
};
Run Code Online (Sandbox Code Playgroud)
情况1:
var car = {type: "BMW", model: "i8", color: "white"};
car['owner'] = "ibrahim"; // You can add a property:
Run Code Online (Sandbox Code Playgroud)
案例2:
var car:any = {type: "BMW", model: "i8", color: "white"};
car.owner = "ibrahim"; // You can set a property: use any type
Run Code Online (Sandbox Code Playgroud)
您可以使用传播运算符基于旧对象创建新对象
interface MyObject {
prop1: string;
}
const myObj: MyObject = {
prop1: 'foo',
}
const newObj = {
...myObj,
prop2: 'bar',
}
console.log(newObj.prop2); // 'bar'
Run Code Online (Sandbox Code Playgroud)
TypeScript将推断原始对象的所有字段,而VSCode将执行自动补全,等等。
小智 7
你可以使用这个:
this.model = Object.assign(this.model, { newProp: 0 });
Run Code Online (Sandbox Code Playgroud)
这是 的一个特殊版本Object.assign,它会随着每个属性的变化自动调整变量类型。不需要额外的变量、类型断言、显式类型或对象副本:
function assign<T, U>(target: T, source: U): asserts target is T & U {
Object.assign(target, source)
}
const obj = {};
assign(obj, { prop1: "foo" })
// const obj now has type { prop1: string; }
obj.prop1 // string
assign(obj, { prop2: 42 })
// const obj now has type { prop1: string; prop2: number; }
obj.prop2 // number
// const obj: { prop1: "foo", prop2: 42 }
Run Code Online (Sandbox Code Playgroud)
注意:示例使用了 TS 3.7断言函数。的返回类型assign是void,与 不同Object.assign。
为了确保类型是Object(即键值对),请使用:
const obj: {[x: string]: any} = {}
obj.prop = 'cool beans'
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式将成员添加到现有对象
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();
Run Code Online (Sandbox Code Playgroud)
Javascript:
myObj.myProperty = 1;
Run Code Online (Sandbox Code Playgroud)
打字稿:
myObj['myProperty'] = 1;
Run Code Online (Sandbox Code Playgroud)
最简单的将是
const obj = <any>{};
obj.prop1 = "value";
obj.prop2 = "another value"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
257918 次 |
| 最近记录: |