【发布时间】:2020-09-19 02:01:36
【问题描述】:
我正在研究类和接口。我有一件事情让我很恼火,这是我第一次处理这类事情,所以请耐心等待..
假设我得到了这个界面:
// IFoo.d.ts
export default interface IFoo {
foo: string;
bar: number;
}
当我在一个类中实现它时,我会执行以下操作:
// FooModel.ts
import IFoo from './IFoo';
export default class FooModel implements IFoo {
foo: string;
bar: number;
constructor({ foo, bar }: IFoo = { foo: 'hello', bar: 1 }) {
this.foo = foo;
}
}
为什么我必须重新实现相同的属性?
这与复制粘贴基本相同,但有严格的约定。此外,我必须输入 foo 和 bar 总共 6 次,才能根据界面正确分配默认 optional 值。 p>
还有更有效的方法吗?
编辑;我正在努力实现以下目标:
具有属性的类,其中的属性可用于 typescript 的检查,如下所示: 界面
export default interface FooDTO {
foo: string;
bar: number;
}
模型
export interface IFoo {
foo: string;
bar: number;
}
export default class FooModel implements IFoo {
foo: string;
bar: number;
constructor({ foo, bar }: IFoo = { foo: 'hello', bar: 1 }) {
this.foo = foo;
}
}
控制器
export default class FooController {
public static async readAll(): Array<FooDTO> {
// some model stuff which maps query to dto
return Array<FooDTO>result;
}
}
【问题讨论】:
-
为什么要在接口上定义属性?
-
@Jenny O'Reilly 所以我可以将它们用于类型分配,假设我使用
function findById(id: number): Array<IFoo> { ... some fetching here ...; return Array<IFoo>results; }。它更多的是为了一致性/明确的可读性和 IDE infellisense -
好的。没关系。但是为什么你还有一个实现它的类呢?
-
@JennyO'Reilly 所以我可以创建一个新实例来创建模型,我希望它具有与接口相同的属性并分配它,例如:
const foo: FooModel = new FooModel({foo: "hi"});这只会在新实例上操作 foo 而不是 bar,因为 bar 有一个默认值。 -
@JennyO'Reilly 我可能确实会提出一个非常明确的新问题,我可能会稍后再做
标签: typescript class implements