【发布时间】:2020-04-09 11:50:17
【问题描述】:
我最近遇到了这个问题,我不确定是使用接口还是类来定义特定类型。
注意:这个问题不是询问
class和interface之间的区别
例如,给定这个类和接口
interface IMyClass {
foo: string;
bar: () => string;
}
class MyClass implements IMyClass {
foo = 'foo';
bar() {
return 'bar';
}
}
我会使用类或接口作为函数参数中的类型。
选项 A - 使用 class 作为类型
function identityByClass(value: MyClass): MyClass {
return value;
}
选项 B - 使用 interface 作为类型
function identityByInterface(value: IMyClass): IMyClass {
return value;
}
从我的角度来看,我认为两者都可以,但我更喜欢使用类来避免同步接口上的所有方法/属性。我认为接口只是一个类必须遵守的模板/契约。
但是,就我而言,大多数时候,该类通常会添加更多不在接口定义中的方法/属性。
举个例子,下面这个类。
class MyClassPlus implements IMyClass {
foo = 'foo';
bar() {
return 'bar';
}
doMore() {
console.log('more stuff here!');
}
}
在这种情况下,我不能再交替使用这两者。
任何指向最佳实践的链接也很好。谢谢。
【问题讨论】:
-
一般如果使用接口,你不用管
MyClassPlus有更多的功能吧? , 因为系统是依赖接口而不是MyClassPlus。如果是,你关心它,问题可能是如何为你的系统“设计”一个更通用的界面。 -
嘿@TimChang!对了,就是这个问题。一旦我在接口上定义的基础上添加到类中,如果我想访问那些添加的方法或属性,我必须使用该类。问题是是同步接口还是只使用类作为增强类的类型。
-
可能你同时有不同的行为?如果这是你的情况,你可以定义两个接口来处理
void DoSome<T>(T myclass) where T : IMyClassA , IMyClassB,因为你拆分了接口,所以你不能将所有 MyClassPlus 方法/属性同步到一个接口。
标签: typescript oop typescript-typings