用值实例化打字稿类实例(对象初始化)
Posted
技术标签:
【中文标题】用值实例化打字稿类实例(对象初始化)【英文标题】:instantiate typescript class instance with values (object initialization) 【发布时间】:2018-08-14 14:06:05 【问题描述】:因此,在 c# 中,您可以使用 object initializer 语法用值实例化一个类。在 TypeScript 中,似乎没有相同类型的对象初始化器语法。我发现你可以使用以下两种方法来初始化值:
构造函数初始化:
class MyClass
constructor(num: number, str: string)
this.numProperty = num;
this.strProperty = str;
numProperty: number;
strProperty: string;
let myClassInstance = new MyClass(100, 'hello');
对象类型转换:
class MyClass
numProperty: number;
strProperty: string;
let myClassInstance = <MyClass>
numProperty: 100,
strProperty: 'hello'
;
虽然我喜欢在 TypeScript 中使用对象类型转换语法,但它只适用于没有您需要使用的方法的简单 DTO 类。这是因为强制转换实际上不会创建您要转换到的类类型的对象。
还有其他方法可以在 TypeScript 中进行对象初始化吗?
【问题讨论】:
相关:TypeScript and field initializers 注意对象类型转换选项。 TS 编译器会知道对象的类型是MyClass
,但 javascript 不会:myClassInstance instanceof MyClass
将返回 false。
TypeScript and field initializers的可能重复
【参考方案1】:
如果您喜欢“类型转换”方法但想要获取该类的实际实例,您可以使用Object.assign 或类似以下的辅助函数:
function init<T>(ctor: new () => T, props: Partial<T>): T
return Object.assign(new ctor(), props);
你可以像这样使用它:
class MyClass
public numProperty: number = 0;
public strProperty: string = "";
public worksWithMethodsToo()
console.log("numProperty: "+this.numProperty);
console.log("strProperty: "+this.strProperty);
let myClassInstance = init(MyClass, numProperty: 100, strProperty: 'hello' );
myClassInstance.worksWithMethodsToo(); // works
还有一个版本的“构造函数初始化”方法,通过在构造函数签名中的参数上使用public
或private
等访问修饰符来创建所谓的parameter properties,可以更轻松地编写构造函数:
class MyClass
// body of constructor is not necessary
constructor(public numProperty: number, public strProperty: string)
let myClassInstance = new MyClass(100, 'hello');
这与您原来的 MyClass
或多或少相同(我猜参数名称不同),但它减少了样板代码。
这有帮助吗?祝你好运。
【讨论】:
以上是关于用值实例化打字稿类实例(对象初始化)的主要内容,如果未能解决你的问题,请参考以下文章