관리 메뉴

Life goes slowly...

[TypeScript] 타입스크립트의 타입호환 본문

프로그래밍/Javascript

[TypeScript] 타입스크립트의 타입호환

빨강소 2023. 12. 7. 14:05
728x90
반응형

 

타입스크립트(TypeScript)의 타입 호환이란 타입스크립트 코드에서 특정 타입이 다른 타입과 잘 맞는지를 의미합니다.

기본적으로 자바스크립트는 객체 리터럴이나 익명 함수 등을 사용하기 때문에 명시적으로 타입을 지정하는 것보다는 코드의 구조 관점에서 타입을 지정하는 것이 더 올바른 코드 방식입니다.

 

interface user {
	name: string;
}

inteface login {
	name: string;
}

let i: user;
i = new login();

 

구조적 타이핑 예시

 

구조적 타이핑이란 코드 구조 관점에서 타입이 서로 호환되는지의 여부를 판단하는 것입니다. 

interface Users {
  name: string;
}

let loginName: Users;

// 타입스크립트가 추론한 y의 타입은 { name: string; location: string; } 입니다.
let loginUsers = { name: "redcow7", location: "Seoul" };
loginName = loginUsers;

 

Soundness(건전성)란?

 

타입스크립트(TypeScript)에서 기본적으로 타입 안정성을 지키려고 하는것을 말합니다. 컴파일 시점에 타입을 추론할 수 없는 특정 타입에 대해서는 '일단 안전하다'라고 보는 특성이 있습니다.

프로그래밍 언어의 설계는 단순성, 사용성, 건전성의 절충 이기 때문입니다.

 

 

Enum 타입 호환 주의 사항

 

Enum 타입은 number 타입과 호환이 가능하지만, Enum 타입끼리는 호환이 불가능합니다.

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };

let status = Status.Ready;
status = Color.Green;  // Error

 

Class 타입 호환 주의 사항

 

Class 타입은 Class 타입끼리 비교할 때 스태틱 멤버(static member)와 생성자(constructor)를 제외하고 속성만 비교를 합니다.

class User {
  handSize: number;
  constructor(name: string, numHand: number) { }
}

class LoginUser {
  handSize: number;
  constructor(numHand: number) { }
}

let a: User;
let s: LoginUser;

a = s;  // OK
s = a;  // OK

 

제네릭 타입 호환(Generics)

 

Generics은 제네릭 타입 간의 호환 여부를 판단할때 타입 인자가 속성에 할당되었는지를 기준으로 판단합니다.

interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;

x = y;  // OK, because y matches structure of x


interface NotEmpty<T> {
  data: T;
}
let x: NotEmpty<number>;
let y: NotEmpty<string>;

x = y;  // Error, because x and y are not compatible

 

 

 

 

참고:

https://joshua1988.github.io/ts/guide/type-compatibility.html#class-%ED%83%80%EC%9E%85-%ED%98%B8%ED%99%98-%EC%A3%BC%EC%9D%98-%EC%82%AC%ED%95%AD

728x90
반응형
Comments