我想修改博客构造器从“最小的工作示例”下面的方式被描述为“伪代码”。如何通过泛型ModelHelper类初始化类“Blog”的成员,以便我可以将Blog构造函数重写为:
伪代码:
constructor(data: Partial<IModel> = {}) {
ModelHelper.initMembers(this, data, initialBlogConfig);
}
export class ModelHelper {
static initMembers<T, U>(model: T, data: Partial<IModel>, initialModel: U): void {
for (key in initModel) {
if(data[key] !== null && data[key] !== undefined) {
model[key] = data[key];
}else{
model[key] = initialModel[key]
}
}
}
}
字符串
“最小工作示例”:
interface IBlog {
title: string;
content: string;
}
const initialBlogConfig: IBlog = {
title: "",
content: "",
};
interface IModel {
[key: string]: any;
}
class Blog implements IBlog {
title: string;
content: string;
constructor({title, content}: Partial<IModel> = {}) {
this.title = title ?? "";
this.content = content ?? "";
}
}
型
1条答案
按热度按时间yhxst69z1#
如果你想写一个helper函数来处理属性初始化的所有方面,而不是使用初始化器或直接在构造函数中分配属性,那么编译器将无法告诉属性已经初始化,你需要使用一个明确的赋值Assert(
!
)来抑制错误:字符串
其中
NullableProps<T>
是以下形式的实用程序类型型
因此所有属性都是可选的(因此它们可以是missing或
undefined
)和可空的(因此它们也可以是null
)。如果是这样,那么您可以以任何方式实现
initMembers()
。这里有一个方法:型
如果你真的想这样做,你可以把它写成一个
class
和一个static
方法,但是如果你不打算使用这个类的构造函数,那么这样做就没有必要(就像在Java中一样),也没有特别的用处。上面的实现首先使用the
Object.assign()
method将initialConfig
的所有属性复制到model
,然后将data
的所有非空属性复制到model
(通过filter
从Object.fromEntries()
获得的条目并通过Object.fromEntries()
转换回来获得)。如果你愿意,你可以使用
for
循环,但是你需要小心从initialConfig
* 和data
* 中获取所有键,以防model
的genericT
类型有任何可选属性:型
任何实现都需要确保正确地复制
opt1
和opt2
。另一方面,如果你不介意使用字段初始化器来处理
initialConfig
的默认值,那么你可以放弃Assert,只让initMembers
处理部分输入:型
使用
for
循环更容易做到这一点,因为只需要担心data
参数,所以你只需要迭代它的键:型
Playground链接到代码