如果省略,是否可能使TypeScript类可选属性返回默认值?

如果省略,是否可能使TypeScript类可选属性返回默认值?,typescript,default,Typescript,Default,如果用户省略了类成员属性的默认值,是否有任何方法可以指定它们 我有一个自定义类,它包含另一个类的可选实例: export class MyClass1 { constructor() { this.name = ""; this.classInstance = new MyClass2(); } name: string; // name of the object classInstance?: MyClass

如果用户省略了类成员属性的默认值,是否有任何方法可以指定它们

我有一个自定义类,它包含另一个类的可选实例:

export class MyClass1 {
    constructor() {
        this.name = "";
        this.classInstance = new MyClass2();
    }
    name: string;           // name of the object
    classInstance?: MyClass2;
}

class MyClass2 {
    constructor() {
        this.name = "MyClass2 initial name";
    }

    name: string;
}
MyClass1的内容来自JSON,因此有时成员变量classInstance可能未定义。在这些情况下,我希望MyClass1构造函数将新的MyClass2()初始化为classInstance成员变量

以下是我如何分配和创建MyClass1实例的方法:

let myNewClass: MyClass1 = {
    name: "MyClass"
}
由于classInstance被省略,我假设它将在构造函数中设置默认值。然而,情况并非如此。我还尝试从classInstance变量中删除可选符号,但这会导致编译错误,因为对象必须匹配MyClass1的结构。我想我通过强制转换成功地编译了,但没有解决问题(尽管我也不确定编译是否正确):

在这两种情况下,classInstance都没有获得构造函数设置的默认值,结果为null/未定义

对我来说,无论如何解决强制转换问题(是设置可选属性还是使用强制转换),只要我可以控制默认值。

这里的问题是

let myNewClass: MyClass1 = {
    name: "MyClass"
} as MyClass1
这里不是
MyClass1
实例。TypeScript类型系统被“欺骗”以为普通对象是
MyClass1
实例

它将被传输到
var myNewClass={name:“MyClass”}
<代码>MyClass1类未实例化。故事结束了

完成预期任务的正确方法是将值从JSON提供给类构造函数。考虑到对象属性(
classInstance
)可以是
未定义的
,类属性不能依赖于默认值,如
构造函数({classInstance=new MyClass2}){…}
,应该手动分配:

export class MyClass1 {
    constructor(jsonMyClass1: MyClass1 = {}) {
        const { name, classInstance } = jsonMyClass1;
        this.name = 'name' in jsonMyClass1 ? name : "";
        this.classInstance = 'classInstance' in jsonMyClass1 ? classInstance : new MyClass2;
    }
    name: string;
    classInstance?: MyClass2;
}

let myNewClass: MyClass1 = new MyClass1({
    name: "MyClass"
});
当提供和处理数据时,考虑到类将如何使用数据(即仅对未定义的值使用
null
),可以修改配方以使用语言提供的能力:

export class MyClass1 {
  constructor(jsonMyClass1: MyClass1 = {} as MyClass1) {
        const { name = "", classInstance = new MyClass2 } = jsonMyClass1;
        this.name = name;
        this.classInstance = classInstance;
    }
    name: string;
    classInstance: MyClass2;
}

let myNewClass: MyClass1 = new MyClass1({
    name: "MyClass",
    classInstance: null
});

这么彻底的回答,谢谢!我只是想问一下这个:
const{title=”“,classInstance=newmyclass2}=jsonMyClass1此语法的作用是什么?这是否意味着第一个title和classInstance是赋值的,然后jsonMyClass1中的字段会覆盖可用的值?但是,如果创建了一个对象,您如何通过键入
this.title=title来访问这些变量在下一行?我对语法有点困惑,我以前从未见过它。你声明常量变量,这是我所理解的,但我不知道它是对象还是单独的变量?不客气。是的。它创建
title
classInstance
temp变量,这是为变量提供默认值的最干净的方法(如果
jsonMyClass1
对象上不存在道具,或者
未定义
)。另一种方法是编写类似于this.classInstance=jsonMyClass1.classInstance!==未定义?jsonMyClass1.classInstance:newclass2
。你可以随时查看它传送到什么,这是学习TS的一个好方法。谢谢!嗯,关于构造函数,我又遇到了一个问题:如果classInstance是MyClass1呢?如何传递消息以确保数据也通过嵌套子类的构造函数传递?例如,一个JSON包含:
{name:“主级别的MyClass1实例”,classInstance:{title:“MyClass1实例嵌套”}}
如何确保也使用构造函数创建MyClass1嵌套?我从json接收整个对象,所以我可以控制在这种情况下如何创建它吗?可能它应该是类似于MyClass1的
const{title,classInstance=new MyClass1}=jsonMyClass1
this.classInstance=classInstance实例?classInstance:新的MyClass1(classInstance)
。这将导致递归类构造。如果您对这种方法有疑问,我建议您提出一个反映所有相关细节的新问题。请注意,即使一个对象是通过解析JSON生成的,如果需要,您也可以预处理一个对象以更好地适应MyClass1构造函数。但对于classInstance,它应该按原样工作。再次感谢。:)最后,我为MyClass1下可能存在的所有子类编写了构造函数,正如您所建议的,MyClass1构造函数将在自己的构造函数(MyClass1)中调用它们。
export class MyClass1 {
  constructor(jsonMyClass1: MyClass1 = {} as MyClass1) {
        const { name = "", classInstance = new MyClass2 } = jsonMyClass1;
        this.name = name;
        this.classInstance = classInstance;
    }
    name: string;
    classInstance: MyClass2;
}

let myNewClass: MyClass1 = new MyClass1({
    name: "MyClass",
    classInstance: null
});