[typescript] TypeScript : 인터페이스와 유형

이 문장들 (인터페이스 대 타입)의 차이점은 무엇입니까?

interface X {
    a: number
    b: string
}

type X = {
    a: number
    b: string
};



답변

당으로 타이프 스크립트 언어 사양 :

이름 지정된 객체 유형을 항상 도입하는 인터페이스 선언과 달리 유형 별명 선언 은 기본 유형, 공용체 및 교차 유형을 포함한 모든 유형의 이름을 도입 할 수 있습니다.

사양은 다음과 같이 언급됩니다.

인터페이스 유형 은 객체 유형 리터럴의 유형 별칭과 많은 유사하지만 인터페이스 유형이 더 많은 기능을 제공하므로 일반적으로 별칭을 입력하는 것이 좋습니다. 예를 들어, 인터페이스 유형

interface Point {
    x: number;
    y: number;
}

타입 별칭으로 쓸 수 있습니다

type Point = {
    x: number;
    y: number;
};

그러나 이렇게하면 다음 기능이 손실됩니다.

  • extends 또는 implements 절에서 인터페이스의 이름을 지정할 수 있지만 TS 2.7 이후 로 객체 유형 리터럴의 유형 별명이 더 이상 참일 수 없습니다 .
  • 인터페이스는 여러 개의 병합 선언을 가질 수 있지만 객체 유형 리터럴의 유형 별명은 사용할 수 없습니다.

답변

2019 년 업데이트


현재 답변과 공식 문서 는 구식입니다. 그리고 TypeScript를 처음 사용하는 사람들에게는 사용 된 용어가 예제없이 명확하지 않습니다. 아래는 최신 차이점 목록입니다.

1. 객체 / 기능

둘 다 객체의 모양이나 함수 서명을 설명하는 데 사용할 수 있습니다. 그러나 구문이 다릅니다.

상호 작용

interface Point {
  x: number;
  y: number;
}

interface SetPoint {
  (x: number, y: number): void;
}

유형 별명

type Point = {
  x: number;
  y: number;
};

type SetPoint = (x: number, y: number) => void;

2. 다른 유형

인터페이스와 달리, 유형 별명은 기본 요소, 공용체 및 튜플과 같은 다른 유형에도 사용될 수 있습니다.

// primitive
type Name = string;

// object
type PartialPointX = { x: number; };
type PartialPointY = { y: number; };

// union
type PartialPoint = PartialPointX | PartialPointY;

// tuple
type Data = [number, string];

3. 연장

둘 다 확장 할 수 있지만 구문은 다릅니다. 또한 인터페이스와 유형 별칭은 상호 배타적이지 않습니다. 인터페이스는 유형 별명을 확장 할 수 있으며 그 반대도 가능합니다.

인터페이스 확장 인터페이스

interface PartialPointX { x: number; }
interface Point extends PartialPointX { y: number; }

타입 별칭은 타입 별칭을 확장합니다

type PartialPointX = { x: number; };
type Point = PartialPointX & { y: number; };

유형 별명을 확장하는 인터페이스

type PartialPointX = { x: number; };
interface Point extends PartialPointX { y: number; }

유형 별명은 인터페이스를 확장

interface PartialPointX { x: number; }
type Point = PartialPointX & { y: number; };

4. 구현

클래스는 인터페이스 또는 유형 별칭을 동일한 방식으로 구현할 수 있습니다. 그러나 클래스와 인터페이스는 정적 청사진으로 간주됩니다. 따라서 통합 유형의 이름을 지정하는 유형 별명을 구현 / 확장 할 수 없습니다.

interface Point {
  x: number;
  y: number;
}

class SomePoint implements Point {
  x = 1;
  y = 2;
}

type Point2 = {
  x: number;
  y: number;
};

class SomePoint2 implements Point2 {
  x = 1;
  y = 2;
}

type PartialPoint = { x: number; } | { y: number; };

// FIXME: can not implement a union type
class SomePartialPoint implements PartialPoint {
  x = 1;
  y = 2;
}

5. 선언 병합

유형 별명과 달리 인터페이스는 여러 번 정의 될 수 있으며 단일 선언으로 취급됩니다 (모든 선언의 멤버가 병합 됨).

// These two declarations become:
// interface Point { x: number; y: number; }
interface Point { x: number; }
interface Point { y: number; }

const point: Point = { x: 1, y: 2 };


답변

TypeScript 3.2 (2018 년 11 월) 기준으로 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


답변

https://www.typescriptlang.org/docs/handbook/advanced-types.html

한 가지 차이점은 인터페이스가 모든 곳에서 사용되는 새로운 이름을 생성한다는 것입니다. 유형 별칭은 새 이름을 만들지 않습니다. 예를 들어 오류 메시지는 별칭 이름을 사용하지 않습니다.


답변

유형이있는 예 :

// 객체의 트리 구조를 만듭니다. 교차로가 없기 때문에 인터페이스에서 동일한 작업을 수행 할 수 없습니다 (&)

type Tree<T> = T & { parent: Tree<T> };

// 몇 가지 값만 할당하도록 변수를 제한하려면 입력하십시오. 인터페이스에는 공용체가 없습니다 (|)

type Choise = "A" | "B" | "C";

// 유형 덕분에 조건부 메커니즘 덕분에 NonNullable 유형을 선언 할 수 있습니다.

type NonNullable<T> = T extends null | undefined ? never : T;

인터페이스 예제 :

// OOP에 인터페이스를 사용하고 ‘구현물’을 사용하여 객체 / 클래스 골격을 정의 할 수 있습니다.

interface IUser {
    user: string;
    password: string;
    login: (user: string, password: string) => boolean;
}

class User implements IUser {
    user = "user1"
    password = "password1"

    login(user: string, password: string) {
        return (user == user && password == password)
    }
}

// 다른 인터페이스로 인터페이스를 확장 할 수 있습니다

    interface IMyObject {
        label: string,
    }

    interface IMyObjectWithSize extends IMyObject{
        size?: number
    }


답변

이미 제공된 훌륭한 답변 외에도 유형과 인터페이스 를 확장 할 때 눈에 띄는 차이점이 있습니다. 최근 인터페이스가 작업을 수행 할 수없는 몇 가지 경우가 발생합니다.

  1. 인터페이스를 사용하여 공용체 유형을 확장 할 수 없습니다
  2. 일반 인터페이스를 확장 할 수 없습니다

답변

문서는 설명했다

  • 한 가지 차이점은 인터페이스가 모든 곳에서 사용되는 새로운 이름을 생성한다는 것입니다. 유형 별칭은 새 이름을 만들지 않습니다. 예를 들어 오류 메시지는 별칭 이름을 사용하지 않습니다. 이전 버전의 TypeScript에서는 유형 별칭을 확장하거나 구현할 수 없었습니다 (다른 유형을 확장 / 구현할 수도 없음). 버전 2.7부터 새로운 교차 유형을 작성하여 유형 별명을 확장 할 수 있습니다.
  • 반면에 인터페이스로 모양을 표현할 수없고 공용체 또는 튜플 형식을 사용해야하는 경우 일반적으로 형식 별칭이 사용됩니다.

인터페이스 대 유형 별명