用值实例化打字稿类实例(对象初始化)

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

还有一个版本的“构造函数初始化”方法,通过在构造函数签名中的参数上使用publicprivate 等访问修饰符来创建所谓的parameter properties,可以更轻松地编写构造函数:

class MyClass 
  // body of constructor is not necessary
  constructor(public numProperty: number, public strProperty: string) 


let myClassInstance = new MyClass(100, 'hello');

这与您原来的 MyClass 或多或少相同(我猜参数名称不同),但它减少了样板代码。


这有帮助吗?祝你好运。

【讨论】:

以上是关于用值实例化打字稿类实例(对象初始化)的主要内容,如果未能解决你的问题,请参考以下文章

详解JAVA对象实例化过程

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?

声明、实例化、初始化和分配对象的含义

实例化类对象中alloc和inti的区别

对象实例化过程

Java对象的实例化过程