typescript 接口不能初始化赋值,为什么我不用class 定义接口?

总所周知,class 也可以当类型用.
那么为啥我不用class 定义接口,并且还能赋予初值

class Options {
  path: string = "";
}
// class 也可以 implements class 的
class Options2 implements Options {
  path: string;
  other: string;
}
// 函数在调用的时候可以直接实例化初始化参数
function doo(options: Options = new Options()) {

}
阅读 705
avatarAI BotBETA

在 TypeScript 中,接口(Interface)和类(Class)确实在某些方面有相似之处,但它们的用途和目的有所不同。这就是为什么即使类可以用作类型,你仍然可能想要使用接口的原因。

接口在 TypeScript 中主要用于定义对象的形状,即对象应该具有哪些属性和方法。接口不能包含实现,只能包含声明。这意味着你不能在接口中初始化属性或定义方法的具体实现。接口的主要目的是提供一种方式来强制实施代码中的某种约定或契约。

类则不同,类是一种面向对象编程的构造,它可以包含属性和方法的声明以及实现。类可以用于创建对象实例,并为这些实例分配初始值。此外,类还可以实现接口,这意味着类必须满足接口中定义的所有属性和方法。

回到你的问题,为什么你不使用类来定义并初始化值,而是使用接口:

  1. 明确性:接口提供了一种明确的方式来定义对象应该具有哪些属性和方法,而不涉及任何实现细节。这使得其他开发人员可以清楚地了解他们应该如何与你的代码交互,而无需查看类的实现。
  2. 多重继承:在 TypeScript 中,类只能继承自一个父类,但可以实现多个接口。这允许你组合多个接口来创建一个类,从而满足多个契约。
  3. 灵活性:使用接口,你可以定义对象的形状,而不必关心对象是如何创建的。这意味着你可以使用任何满足接口的对象,无论它是通过类实例化还是通过其他方式创建的。

在你的示例中,你使用类 OptionsOptions2 来定义对象的形状,并为它们分配了初始值。这是完全可以的,并且在某些情况下可能是合适的。但是,如果你想要定义一个更通用的契约,或者想要允许其他开发人员以不同的方式实现该契约,那么使用接口可能更为合适。

总的来说,选择使用接口还是类取决于你的具体需求。在某些情况下,使用类来定义并初始化值可能更为方便;而在其他情况下,使用接口可能更为合适,因为它提供了更明确的契约和更大的灵活性。

3 个回答

编译后TS会被移除,而class会被保留,增加体积,而且只是类型声明,用一个没有其他用处的class思来想去也是浪费

Class能当Interface使用,这也就是Typescript才赋予的一种能力。其他经典面向对象编程语言,比如Java、C#,你试试让不让你 implement Class?
你这个问题的背后,有两个知识点先要搞清楚

第一,脱离Typescript,从面向对象的角度理解Class和Interface的使用场景

  • Class是个类型工厂,负责 “制造” 实例。
  • Interface表示具备的行为能力,是一种能力声明,用于系统编译检查。
  • 一般面向对象语言,都要求只能继承一个Class(父亲),但是可以实现多个Interface(能力标签)。

第二,回到Typescript,它支持Class可以当Interface使用,期待你如何去用这种能力

  • 为了提高Class的复用性,当某些条件下想强制某个Class X具备Class Y的能力时,不必再去依据Class Y去专门定义一个Interface,直接使用Y就可以。
  • 当想用到这个Class的默认值时,比如参数中限定了这个类型,可以给它一个默认值,像你问题中给的代码一样。

达成以上两点共识后,我们再来回答问题:
为啥不用Class定义接口 ?

  1. 用途不同,即你用牛刀也可以杀鸡,但是你杀鸡一律用牛刀,就丧失了代码的可读性:代码中全是牛刀,别人阅读代码不会马上看出是杀鸡还是杀牛。
  2. 在特殊情况下,比如先有Class,后面又想用它来当做接口约束另外某个Class,为了避免重复定义,这时才可以使用Class当接口用。
  3. 最后,是前面两位兄弟提到的,TS转译成JS后(JS没有Interface一说),Class定义会保留在代码中,如果Class的存在仅仅是为了用作Interface并没有用到默认值,那么是不是凭空增大了代码体积。
推荐问题
logo
Microsoft
子站问答
访问
宣传栏