当前位置: 首页 > 知识库问答 >
问题:

TypeScript中的接口与类型

杭曦
2023-03-14

TypeScript中的这些语句(接口类型)之间有什么区别?

interface X {
    a: number
    b: string
}

type X = {
    a: number
    b: string
};

共有3个答案

奚修伟
2023-03-14

截至TypeScript 3.2(2018年11月),以下情况属实:

狄宪
2023-03-14

2021年3月更新:较新的打字稿手册有一节界面与别名,解释了差异。

原创答案(2016)

根据(现已存档)TypeScript语言规范:

与总是引入命名对象类型的接口声明不同,类型别名声明可以为任何类型引入名称,包括基元、联合和交集类型。

规范还提到:

接口类型与对象类型文字的类型别名有许多相似之处,但由于接口类型提供了更多功能,它们通常比类型别名更受欢迎。例如,接口类型

interface Point {
    x: number;
    y: number;
}

可以写成类型别名

type Point = {
    x: number;
    y: number;
};

但是,这样做意味着失去以下功能:

封昊天
2023-03-14

目前的答案和官方文件已经过时。对于那些刚接触TypeScript的人来说,如果没有例子,所使用的术语就不清楚了。以下是最新的差异列表。

两者都可以用来描述对象的形状或函数签名。但是语法不同。

界面

interface Point {
  x: number;
  y: number;
}

interface SetPoint {
  (x: number, y: number): void;
}

类型别名

type Point = {
  x: number;
  y: number;
};

type SetPoint = (x: number, y: number) => void;

与接口不同,类型别名也可以用于其他类型,如原语、联合和元组。

// primitive
type Name = string;

// object
type PartialPointX = { x: number; };
type PartialPointY = { y: number; };

// union
type PartialPoint = PartialPointX | PartialPointY;

// tuple
type Data = [number, string];

两者都可以扩展,但同样,语法不同。另外,请注意,接口和类型别名不是互斥的。接口可以扩展类型别名,反之亦然。

接口扩展接口

interface PartialPointX { x: number; }
interface Point extends PartialPointX { y: number; }

类型别名扩展类型别名

type PartialPointX = { x: number; };
type Point = PartialPointX & { y: number; };

接口扩展了类型别名

type PartialPointX = { x: number; };
interface Point extends PartialPointX { y: number; }

类型别名扩展接口

interface PartialPointX { x: number; }
type Point = PartialPointX & { y: number; };

类可以以完全相同的方式实现接口或类型别名。但是请注意,类和接口被视为静态蓝图。因此,它们无法实现/扩展命名联合类型的类型别名。

interface Point {
  x: number;
  y: number;
}

class SomePoint implements Point {
  x = 1;
  y = 2;
}

type Point2 = {
  x: number;
  y: number;
};

class SomePoint2 implements Point2 {
  x = 1;
  y = 2;
}

type PartialPoint = { x: number; } | { y: number; };

// FIXME: can not implement a union type
class SomePartialPoint implements PartialPoint {
  x = 1;
  y = 2;
}

与类型别名不同,接口可以多次定义,并将被视为单个接口(合并所有声明的成员)。

// These two declarations become:
// interface Point { x: number; y: number; }
interface Point { x: number; }
interface Point { y: number; }

const point: Point = { x: 1, y: 2 };
 类似资料:
  • 这些语句(接口vs类型)有什么区别?

  • 我最近遇到了这个问题,我不确定是使用接口还是类来定义特定的类型。 注意:这个问题不是问和之间的区别。 例如,给定这个类和接口 我将使用类或接口作为函数参数中的类型。 在我看来,两者都可以,但我更喜欢使用类来避免同步接口上的所有方法/属性。我认为接口只是一个类必须遵守的模板/契约。 但是,在我的例子中,大多数情况下,该类通常会添加更多不在接口定义中的方法/属性。 下面这个类就是一个很好的例子。 在这

  • 本文向大家介绍TypeScript 类接口,包括了TypeScript 类接口的使用技巧和注意事项,需要的朋友参考一下 示例 public在接口中声明变量和方法,以定义其他打字稿代码如何与之交互。 在这里,我们创建一个实现接口的类。 该示例说明如何创建一个接口ISampleClassInterface和一类SampleClass是implements接口。

  • 我需要为对后端服务器的HTTP请求创建某种类型(使用Angular 2),例如:}, 我应该用什么来构建这些模型?谢谢!

  • 我见过类似这样的相关问题,但它们都假设类和接口的区别在于类可以实例化,而接口不能。然而,以@types/google.maps为例,例如: 接口和类: 延伸其他对象 具有属性 具有方法/功能 无法从这些定义直接实例化 在google maps代码中的某个地方,实际上有一个类用于这里定义的< code >类和这里定义的< code >接口。看起来类定义是用户可以实例化的,而不是库可以内部实例化的(接

  • 问题内容: 这两个内部类声明之间有什么区别?还评论优点/缺点吗? 案例A:班级内的班级。 案例B:接口内的类。 进行了更正:放置getvalue方法。 进一步的信息:我能够在没有实现AT AT ALL接口的另一个类中实例化A和B的Items类。 由于未实例化接口,因此不通过实例化LEVELS接口就可以通过点表示法来访问接口内的所有元素,这仅仅是因为您无法实例化接口- 有效地使接口内定义的类可渗透静