Sự khác biệt giữa những điều sau đây là gì?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
Sự khác biệt giữa những điều sau đây là gì?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
Câu trả lời:
Các giao diện có thể được mở rộng
interface A {
x: number;
}
interface B extends A {
y: string;
}
và cũng được tăng cường
interface C {
m: boolean;
}
// ... later ...
interface C {
n: number;
}
Nhập bí danh, tuy nhiên, có thể đại diện cho một số thứ mà giao diện không thể
type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;
Vì vậy, nói chung nếu bạn chỉ có một loại đối tượng đơn giản, như được hiển thị trong câu hỏi của bạn, giao diện thường là một cách tiếp cận tốt hơn. Nếu bạn thấy mình muốn viết thứ gì đó mà không thể viết được dưới dạng giao diện hoặc chỉ muốn đặt một cái tên khác thì tốt hơn là một type alias.
Type aliases, however, can represent some things interfaces can'tDường như với tôi ví dụ của bạn NeatAndCoolvà JustSomeOtherNamecó thể được tạo ra như là giao diện mà mở rộng hiện có Neat, Coolhoặc SomeTypecác loại.
interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
Ngoài ra, một giao diện có thể được thực hiện .
class Thing implements Neat, Cool
Các kiểu giống như Giao diện và ngược lại: cả hai đều có thể được thực hiện bởi một lớp. nhưng có một số khác biệt quan trọng: 1. khi Kiểu được thực hiện bởi một lớp, các thuộc tính thuộc Kiểu phải được khởi tạo bên trong lớp, trong khi với Giao diện, chúng phải được khai báo. 2. như @ryan đã đề cập: Giao diện có thể mở rộng Giao diện khác. Loại không được.
type Person = {
name:string;
age:number;
}
// must initialize all props - unlike interface
class Manager implements Person {
name: string = 'John';
age: number = 55;
// can add props and methods
size:string = 'm';
}
const jane : Person = {
name :'Jane',
age:46,
// cannot add more proprs or methods
//size:'s'
}
Sự khác biệt giữa những thứ này cũng đã có trong chủ đề này.
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
Ở đây type Foovà interface Footrông gần như tương tự nên nó khó hiểu.
interfacelà hợp đồng mà các thuộc tính sau (ở đây foo:string) phải có trong một đối tượng.
interfacekhông class. Nó được sử dụng khi ngôn ngữ không hỗ trợ Đa kế thừa. Vì vậy, interfacecó thể là một cấu trúc chung giữa các lớp khác nhau.
class Bar implements Foo {
foo: string;
}
let p: Foo = { foo: 'a string' };
Nhưng typevà interfaceđược sử dụng trong ngữ cảnh rất khác nhau.
let foo: Foo;
let today: Date = new Date();
Dưới đây typecủa foolà Foovà todaylà Date. Nó giống như một biến phân rã chứa thông tin về kiểu của biến khác.
typegiống như một tập hợp các giao diện, lớp, chữ ký hàm, các kiểu khác hoặc thậm chí các giá trị (như type mood = 'Good' | 'Bad'). Ở cuối typemô tả cấu trúc hoặc giá trị có thể có của một biến.
Nói "Có thể triển khai các giao diện" là sai vì các kiểu cũng có thể được triển khai
type A = { a: string };
class Test implements A {
a: string;
}
Mặc dù bạn có thể làm điều này, nhưng bạn không thể triển khai một kiểu là Liên hợp các kiểu, điều này hoàn toàn có ý nghĩa một cách trung thực :)
gõ trong bảng chữ được sử dụng để tham chiếu các kiểu đã tồn tại . Nó không thể được mở rộng như thế nào interface. Ví dụ về type:
type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];
bạn có thể sử dụng Rest and Spread trong các loại:
type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]
Mặt khác, giao diện cho phép bạn tạo KIỂU MỚI.
interface Person{
name: string,
age: number,
}
Interface can be extended with extends keyword.
interface Todo{
text: string;
complete: boolean;
}
type Tags = [string, string, string]
interface TaggedTodo extends Todo{
tags: Tags
}