功能相似场景雷同,TS中的 type 和 interface 到底有什么区别?
在 TypeScript 中,type 和 interface 都是用来定义类型的关键字。虽然相似,但是它们在语法上和使用场景上是有区别的。本文将通过一些例子来介绍这两个关键字的异同点,帮助读者更好地理解它们的使用。
type
type 是用来定义类型别名(alias)。类型别名是一个简单的名称,可以用来代表某个复杂类型,例如下面这个例子:
type MyString = string;
type MyNumber = number;
let str: MyString = "Hello World";
let num: MyNumber = 100;
在这个例子中,我们使用 type 定义了 MyString 和 MyNumber 这两个类型别名,它们分别代表 string 和 number 类型。通过类型别名,我们可以在代码中使用简单的名称来表示复杂的类型。这种方式有助于提高代码的可读性和可维护性。
type 还可以用来定义更复杂的类型,例如下面这个例子:
type Person = {
name: string;
age: number;
email?: string;
};
let john: Person = {
name: "John",
age: 30
};
在这个例子中,我们使用 type 定义了一个 Person 类型,它包含 name, age 和 email 属性。可选属性 email 在这里使用了问号来表示。我们可以使用 Person 类型来定义一个名为 john 的对象,它包含了 name 和 age 属性。
值得注意的是,类型别名只是给一个类型定义了一个新的名称,不会创建一个新的类型。例如,MyString 和 string 类型是一样的,只不过使用了一个不同的名称而已。
interface
interface 是用来定义特定属性和方法的对象类型的。例如:
interface Person {
name: string;
age: number;
email?: string;
}
let john: Person = {
name: "John",
age: 30
};
这里我们使用 interface 定义了一个一样的 Person 类型,它也包含了 name, age 和 email 属性。与 type 不同的是,interface 还可以包含方法。例如:
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log("Woof!");
}
}
let dog: Animal = new Dog("Buddy");
dog.makeSound(); // Output: "Woof!"
在这个例子中,我们定义了一个 Animal 接口,它有一个 name 属性和一个 makeSound 方法。我们创建了一个 Dog 类,它实现了 Animal 接口。makeSound 方法输出 "Woof!"。在最后一行代码中,我们使用 Animal 类型来定义一个名为 dog 的对象,并调用了它的 makeSound 方法。
除了接口可以被类实现以外,它还可以被对象、函数等使用。例如:
interface Greeting {
(name: string): string;
}
let sayHello: Greeting = function(name: string) {
return `Hello, ${name}!`;
};
console.log(sayHello("John")); // Output: "Hello, John!"
在这个例子中,我们定义了一个 Greeting 接口,它是一个函数类型,接受一个名为 name 的参数,并返回一个字符串。我们定义了一个名为 sayHello 的函数,它实现了 Greeting 接口。最后一行代码中,我们调用 sayHello 函数,并传入了一个名为 John 的参数。
和 type 不同的是,接口是一个真正的类型,它会在编译时被编译器检查和验证。
使用场景
通常情况下,type 和 interface 可以互换使用,但在某些场景下,它们的使用是有区别的。
当我们需要描述一个函数或对象的形状时,应该使用 interface。例如:
interface Square {
width: number;
height: number;
area(): number;
}
function createSquare(width: number, height: number): Square {
let square: Square = {
width: width,
height: height,
area: function() {
return this.width * this.height;
}
};
return square;
}
let mySquare: Square = createSquare(5, 5);
console.log(mySquare.area()); // Output: 25
在这个例子中,我们使用 interface 定义了一个 Square 接口,它有 width, height 和 area 三个属性。我们定义了一个名为 createSquare 的函数,它返回一个 Square 类型的对象。在函数内部,我们创建了一个 square 对象,并实现了它的 area 方法。最后,我们使用 Square 类型来定义一个名为 mySquare 的对象,并使用它的 area 方法计算出面积。
总结
在 TypeScript 中,type 和 interface 是两种定义类型的关键字。它们都可以用来定义类型别名,但 type 更适合于定义简单类型别名,interface 更适合于定义对象类型别名。另外,interface 还可以用来定义类的形状、继承和扩展,type 则更适合于定义复杂类型、联合类型、交叉类型等。在使用时,我们应该根据具体的场景选择合适的方式,以达到更好的代码可读性和维护性。
转载自:https://juejin.cn/post/7231484081367629881