Typescript에서 유형과 인터페이스의 차이점은 무엇입니까?


114

다음의 차이점은 무엇입니까?

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

3
유형은 인터페이스 확장처럼 확장 될 수 없습니다. 유형은 유형의 별칭 일뿐입니다.
PSL


2
예를 들어 JSON 파일의 외부 데이터 또는 OOP 클래스를 사용하지 않고 함수 만 작성하는 경우 주로 유형을 사용합니다.
Kokodoko

1
- 나는 차이 설명이이 문서가 유용하다고 medium.com/@martin_hotell/...
하기 Sandeep GB

1
허용되는 답변이 오래되었습니다. 여기에 게시 된 설명 업데이트 (스레드가 Google에서 선호하는 것 같기 때문에) : stackoverflow.com/questions/37233735/…
jabacchetta

답변:


125

인터페이스 확장 가능

interface A {
  x: number;
}
interface B extends A {
  y: string;
}

또한 증강

interface C {
  m: boolean;
}
// ... later ...
interface C {
  n: number;
}

그러나 타입 별칭은 인터페이스가 할 수없는 것들을 나타낼 수 있습니다.

type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;

따라서 일반적으로 질문에 표시된 것처럼 일반 객체 유형 만있는 경우 일반적으로 인터페이스가 더 나은 접근 방식입니다. 인터페이스로 쓸 수없는 것을 작성하고 싶거나 다른 이름을 지정하고 싶다면 타입 별칭이 더 좋습니다.


3
Type aliases, however, can represent some things interfaces can't그것은 나에게 당신의 예를 보인다 NeatAndCoolJustSomeOtherName기존의 확장 인터페이스로 만들 수 있습니다 Neat, Cool또는 SomeType유형.
Rudey

실제로 두 번째와 세 번째 예제는 인터페이스로 만들 수 있습니다.interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
peterjwest

3
두 인터페이스를 확장한다고해서 항상 교차 유형과 동일한 결과가 생성되는 것은 아니며 모든 유형이 확장 될 수있는 것은 아닙니다 (반면에 모든 유형은 별칭을 지정하거나 공용체 / 교차에 넣을 수 있음).
Ryan Cavanaugh

1
그렇다면 유형의 장점은 무엇입니까? 인터페이스가있을 때 유형이 유용하지 않다고 말할 수 있습니까?
Mostafa Saadatnia

4

또한 인터페이스를 구현할 수 있습니다 .


1
그리고 객체는 여러 인터페이스를 구현할 수 있습니다class Thing implements Neat, Cool
Kokodoko 2017-08-16

1
원하는게 뭐야 ? 또한 Type can b 구현
nadav

3
이것은 답변이 아닌 주석이어야합니다.
Michael Kunst

Dave에게, 답변이 아닌 코멘트를 남겨야합니다. 또한 이 답변을 바탕으로 귀하의 답변이 정확하지 않습니다.
Mehrdad88sh

4

유형은 인터페이스와 비슷하며 그 반대도 마찬가지입니다. 둘 다 클래스에 의해 구현 될 수 있습니다. 그러나 몇 가지 중요한 차이점이 있습니다. 1. Type이 클래스에 의해 구현 될 때 Type에 속하는 속성은 클래스 내에서 초기화되어야하지만 Interface에서는 선언되어야합니다. 2. @ryan이 언급했듯이 인터페이스는 다른 인터페이스를 확장 할 수 있습니다. 유형은 할 수 없습니다.

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

이것들 사이의 차이점도 이미이 스레드에 있습니다.

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

여기 type Foointerface Foo거의 비슷해 보이므로 혼란 스럽습니다.

interface다음 속성 (여기 foo:string)이 객체에 있어야한다는 계약입니다 . interface이 아닙니다 class. 언어가 다중 상속을 지원하지 않을 때 사용됩니다. 따라서 interface서로 다른 클래스 간의 공통 구조가 될 수 있습니다.

class Bar implements Foo {
    foo: string;
}

let p: Foo = { foo: 'a string' };

그러나 typeinterface매우 다른 맥락에서 사용된다.

let foo: Foo;
let today: Date = new Date();

여기 typefoo입니다 Footoday입니다 Date. 다른 변수의 유형 정보를 보유하는 변수 감소와 같습니다. type인터페이스, 클래스, 함수 시그니처, 기타 유형 또는 값 (예 :)의 상위 집합과 같습니다 type mood = 'Good' | 'Bad'. 끝에는 type변수의 가능한 구조 또는 값을 설명합니다.


4

유형도 구현할 수 있으므로 "인터페이스 구현 가능"이라고 말하는 것은 잘못되었습니다.

type A = { a: string };


class Test implements A {

    a: string;
}

이 작업을 수행 할 수는 있지만 유형 조합 인 유형을 구현할 수는 없습니다.


4

typescript의 type은 기존 유형 을 참조하는 데 사용됩니다 . 처럼 확장 할 수 없습니다 interface. 예 type:

type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];

Rest 및 Spread를 사용할 수있는 유형 :

type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]

반면에 인터페이스를 사용하면 새 유형을 만들 수 있습니다.

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.