javascript - TypeScript 接口可选参数,但不被视为可选参数
问题描述
我有一个具有可选属性的接口,但它在我的构造函数中设置为默认值,然后用从构造函数的第一个参数传入的值覆盖。如果未设置属性,则使用默认值。
我怎样才能得到它,以便参数在传递给构造函数时仍然是可选的,但是在类中使用时,它被视为已设置。我不想收到以下错误:
对象可能是“未定义的”。
export interface IMain {
req: string;
prop?: ISecondary;
}
export interface ISecondary {
a?: string;
b?: string;
}
export class ABC {
public main: Main;
public constructor(main: Main) {
this.main.prop = {
a: "A",
b: "B",
...main.prop
};
}
public doSomething() {
this.main.prop.a = "Z";
}
}
new ABC({
req: 'cat'
});
解决方案
一种方法是将属性设为非可选,然后使用 aPartial<IMain>
将参数的所有属性设为可选:
export interface IMain {
prop: ISecondary;
}
export interface ISecondary {
a?: string;
b?: string;
}
const ISecondaryDefaults: ISecondary = {
a: "A",
b: "B",
};
export class ABC {
public main: IMain;
public constructor(main: Partial<IMain>) {
this.main = {
...main,
prop: {
...ISecondaryDefaults,
...main.prop,
},
};
}
public doSomething() {
this.main.prop.a = "Z";
}
}
推荐阅读
- entity-framework - 使用 ASP.NET 身份注册用户但将其他相关信息存储在另一个表中的最佳方法是什么
- ios - 生成通行证未加载
- oracle - odac setup error ins-50013 Oracle Developer Tools for Visual Studio .NET 错误
- node.js - Cloud Functions IPv6 连接问题
- node.js - 是否可以将 mongoDB 中的二进制图像数据存储渲染到车把模板?
- ruby - 在一个网站上使用多个主题 jeykll
- android - 为什么 Android 上的 Google Chrome 呈现我的表格与桌面或 Firefox 中的不同?
- javascript - 我想在 javascript 函数中包含一个 php 代码
- asp.net - ASP.NET Framework 控制台应用中的 Azure AD 身份验证和授权
- php - Html2pdf表格行转到下一页