Trong Typecript, sự khác biệt giữa kiểu và giao diện là gì?


114

Sự khác biệt giữa những điều sau đây là gì?

type Foo = { 
    foo: string 
};
interface Foo {
   foo: string;
}

3
loại không thể được mở rộng như phần mở rộng giao diện. các loại chỉ là bí danh cho một loại.
PSL

4
Hướng dẫn có sẵn tại đây: basarat.gitbooks.io/typescript/content/docs/types/…
basarat

2
Tôi chủ yếu sử dụng kiểu cho dữ liệu bên ngoài, ví dụ từ tệp JSON hoặc nếu bạn chỉ viết hàm mà không sử dụng các lớp OOP.
Kokodoko

1
Tôi thấy bài viết này hữu ích giải thích sự khác biệt - medium.com/@martin_hotell/…
Sandeep GB

1
Câu trả lời được chấp nhận đã lỗi thời. Giải thích cập nhật được đăng ở đây (kể từ khi chủ đề mà dường như được ưa chuộng bởi Google): stackoverflow.com/questions/37233735/...
jabacchetta

Câu trả lời:


125

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.


3
Type aliases, however, can represent some things interfaces can'tDường như với tôi ví dụ của bạn NeatAndCoolJustSomeOtherNamecó thể được tạo ra như là giao diện mà mở rộng hiện có Neat, Coolhoặc SomeTypecác loại.
Rudey

Thật vậy, ví dụ thứ hai và thứ ba có thể được tạo bằng giao diện:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
peterjwest,

3
Mở rộng hai giao diện sẽ không luôn luôn tạo ra kết quả tương tự như một loại ngã, và không phải tất cả các loại có thể được mở rộng (trong khi tất cả các loại có thể được aliased hoặc đưa vào các công đoàn / nút giao thông)
Ryan Cavanaugh

1
Vậy ưu điểm của loại hình là gì? Chúng ta có thể nói khi chúng ta có giao diện, loại không hữu ích?
Mostafa Saadatnia

4

Ngoài ra, một giao diện có thể được thực hiện .


1
Và một đối tượng có thể triển khai nhiều giao diệnclass Thing implements Neat, Cool
Kokodoko

1
ý bạn là gì ? Loại này cũng có thể thực hiện b
Nadav

3
Đây phải là một bình luận không phải là một câu trả lời imo.
Michael Kunst

Dave thân mến, bạn nên để lại một bình luận không phải là một câu trả lời. Cũng dựa trên câu trả lời này câu trả lời của bạn là không chính xác đúng.
Mehrdad88sh

4

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'
}

4

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 Foointerface 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 typeinterfaceđượ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 fooFootodayDate. 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.


4

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 :)


4

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.