如何通过指定每个属性及其值来实例化 TypeScript 中的对象?

Posted

技术标签:

【中文标题】如何通过指定每个属性及其值来实例化 TypeScript 中的对象?【英文标题】:How to instantiate an object in TypeScript by specifying each property and its value? 【发布时间】:2017-09-05 00:04:02 【问题描述】:

这是一个 sn-p,其中我在我的服务中实例化了一个新的 content 对象:

const newContent = new Content(
     result.obj.name
     result.obj.user.firstName,
     result.obj._id,
     result.obj.user._id,
);

问题在于,这种对象实例化方式依赖于我的content 模型中的属性顺序。我想知道是否有办法通过将每个属性映射到我想要设置的值来做到这一点,例如:

 const newContent = new Content(
     name: result.obj.name,
     user: result.obj.user.
     content_id: result.obj._id,
     user_id: result.obj.user._id,
 );

【问题讨论】:

【参考方案1】:
const newContent = <Content>(
    name: result.obj.name,
    user: result.obj.user.
    content_id: result.obj._id,
    user_id: result.obj.user._id,
 );

在这里,您可以实例化一个对象并使用类型断言或强制转换为 Content 类型。 有关类型断言的更多信息:https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions

【讨论】:

很清楚您所做的更改,但说明原因会很有用。无处不在的教学时刻。 这其实是非常非常错误的!您没有在此处实例化 Content 的实例,您正在创建一个具有相同成员的简单对象。例如,如果Content 有一个方法fn,那么在您的示例中这将失败:newContent.fn() 如果您像这样扩展对象的原型,此答案将起作用:const newContent = &lt;Content&gt;(_.extend(..., Content.prototype));【参考方案2】:

您可以将一个对象传递给包含所有这些变量的构造函数:

type ContentData = 
    name: string;
    user: string;
    content_id: string;
    user_id: string;


class Content 
    constructor(data: ContentData) 
        ...
    

然后:

const newContent = new Content(
     name: result.obj.name,
     user: result.obj.user.
     content_id: result.obj._id,
     user_id: result.obj.user._id,
);

【讨论】:

以上是关于如何通过指定每个属性及其值来实例化 TypeScript 中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

Java类的定义及其实例化

PUN2:通过 RPC 调用指定一个实例化的玩家游戏对象

用TypeScript开发Vue——如何通过vue实例化对象访问实际ViewModel对象

如何使用 CustomStringConvertible 和 RawRepresentable 组合类型指定函数参数的类型?

如何在 Qt 5 中使用带有实例化的 VAO

python笔记十五(面向对象及其特性)