이 문장들 (인터페이스 대 타입)의 차이점은 무엇입니까?
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 };
답변
답변
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
}
답변
이미 제공된 훌륭한 답변 외에도 유형과 인터페이스 를 확장 할 때 눈에 띄는 차이점이 있습니다. 최근 인터페이스가 작업을 수행 할 수없는 몇 가지 경우가 발생합니다.
답변
문서는 설명했다
- 한 가지 차이점은 인터페이스가 모든 곳에서 사용되는 새로운 이름을 생성한다는 것입니다. 유형 별칭은 새 이름을 만들지 않습니다. 예를 들어 오류 메시지는 별칭 이름을 사용하지 않습니다. 이전 버전의 TypeScript에서는 유형 별칭을 확장하거나 구현할 수 없었습니다 (다른 유형을 확장 / 구현할 수도 없음). 버전 2.7부터 새로운 교차 유형을 작성하여 유형 별명을 확장 할 수 있습니다.
- 반면에 인터페이스로 모양을 표현할 수없고 공용체 또는 튜플 형식을 사용해야하는 경우 일반적으로 형식 별칭이 사용됩니다.