【发布时间】:2020-05-11 09:59:07
【问题描述】:
假设我有这个界面:
// foo.d.ts
export default interface IFoo {
bar: number;
faz: string;
moo: {
cat: boolean;
cow: boolean;
};
}
我基于此创建了一个类(模型):
// fooModel.ts
import IFoo from "./interfaces/foo";
export default class FooModel implements IFoo {
// now I don't like this
bar = 0;
faz = "";
moo = {
cat: false,
cow: true
}
// optional property because default values
// I also don't like this because I have to type the prop name like 3 times
constructor(_foo?: IFoo) {
if(_foo === undefined) return;
this.bar = _foo.bar;
this.faz = _foo.faz;
this.moo = {
cat: _foo.moo.cat,
cow: _foo.moo.cow
}
}
}
我这样称呼它
// fooController.ts
import FooModel from "./fooModel";
import IFoo from "../interfaces/foo";
export default class FooController {
getFoo(params?: object) {
return new FooModel(params)
}
}
为了获得具有默认值的东西,这需要做很多工作。如您所见,我必须输入cat 和cow 属性4 次才能正确初始化。当你有一个大模型时,这会导致很多混乱。
有没有更好的方法来做到这一点?
【问题讨论】:
-
FooModel中的属性不需要输入,它们的类型已经在IFoo中定义:typescriptlang.org/play?#code/… -
@jonrsharpe 是的,确实,但我希望它们具有默认值.. 这在接口中是不可能的
-
那我就更不清楚你的问题是什么了。
-
@jonrsharpe 我为您更新了问题,并实施了您的评论
-
“我不喜欢这个” - 强硬?您不能将默认值放在接口中,因为它们在运行时不存在。您可以使用typescriptlang.org/play?#code/… 之类的名称,或者直接缩短为
this.moo = _foo.moo。或者,如果您想改用模块,改用模块。
标签: typescript oop