typescript:interface vs type,一字点明他们的区别
2023-09-03 06:30:48
在TypeScript中,interface 和type 都是用于定义类型的声明。但是,它们在本质上有所不同。
interface 可以被视为一种契约 ,它了某个对象或类应该具有哪些属性和方法。它强制实现该接口的类或对象必须提供这些属性和方法。从本质上讲,接口是隐式声明 的,这意味着编译器会自动生成接口实现的代码。
另一方面,type 是一种显式声明 类型的方式。它直接定义了一个变量或表达式的类型。与接口不同,type不会强制实现。相反,它只是检查变量或表达式的值是否与指定的类型匹配。
在TypeScript中,type通常用作别名 ,为现有类型提供一个更方便或更简洁的名称。例如,以下代码创建了一个名为MyType 的类型别名,它表示一个带有name属性的字符串数组:
type MyType = string[];
现在,我们可以使用MyType 来声明变量或参数,就像使用任何其他类型一样:
let myArray: MyType = ["TypeScript", "JavaScript", "Angular"];
需要注意的是,interface 也可以用作别名,但它并不像type 那样常见。这是因为interface 通常用于定义契约,而不是仅仅创建别名。
interface 和type 之间的另一个区别在于继承和扩展。interface 可以继承自其他接口,而type 不能。这意味着interface 可以创建类型层次结构,允许类型重用和代码组织。
例如,以下代码定义了两个接口Person 和Employee ,其中Employee 继承自Person :
interface Person {
name: string;
age: number;
}
interface Employee extends Person {
salary: number;
department: string;
}
现在,我们可以使用Employee 接口来定义一个类,该类将具有Person 和Employee 接口中定义的所有属性和方法:
class Employee implements Employee {
name = "John Doe";
age = 30;
salary = 50000;
department = "Engineering";
}
type 不能继承,但可以扩展。type 扩展允许我们创建新的类型,这些类型基于现有类型,但具有附加属性或功能。例如,以下代码定义了一个新的类型ExtendedType ,它扩展了MyType 并添加了一个length 属性:
type ExtendedType = MyType & {
length: number;
};
现在,我们可以使用ExtendedType 来声明变量或参数,就像使用任何其他类型一样:
let myExtendedArray: ExtendedType = ["TypeScript", "JavaScript", "Angular"];
myExtendedArray.length; // 3
综上所述,interface 和type 是TypeScript中定义类型的两种重要方式。interface 可以被视为一种契约,了某个对象或类应该具有哪些属性和方法,而type 通常用作别名,为现有类型提供一个更方便或更简洁的名称。interface 可以继承自其他接口,而type 可以扩展。通过理解这些差异,我们可以有效地利用这些概念来创建健壮且可维护的TypeScript代码。