TypeScript Type Inference 완

Type Inference

목차

  1. Introduction

  2. Basics

  3. Best common type

  4. Contextual Type

Introduction

이번 섹션에서는 우리는 ts에서 타입의 추정에 대해 다룰 것입니다. 말 했듯이, 어디서 어떻게 타입이 추론되어지는지에 대해 논할 것입니다.

Basic

ts에서는 타입이 명시적으로 지정되지 않은 타입 정보를 제공하기 위해 사용되는 추론이 여러 곳에 있습니다. 예를 들자면 이 코드에서

let x = 3;

x의 타입은 숫자라고 추론이 됩니다. 이런 종류의 추론은 변수나 숫자의 초기화할때나 인자값의 기본값 설정할때, 그리고 함수의 반환 타입을 설정할때 일어납니다. 대부분의 경우에는 타입 추론은 매우 간단합니다. 다음 섹션에서 타입이 추론되는 상황들 대해 설명할 것입니다.

Best common type

타입 추론이 여러 expression들로부터 만들어질 때, 이 expression들의 타입들은 'best common type을 계산하기 위해 사용되어집니다.

let x= [0, 1, null];

x의 타입을 예제에서 추론하기위해서, 우리는 반드시 배열의 각각의 요소드리의 타입을 생각해야합니다. 여기서 우리는 배열이 어떤 타입이 될지를 선택하기 위해 number또는 null의 두가지 타입에 선택지가 있습니다. best common type 알고리즘은 각각의 후보들을 고려한뒤에, 모든 후보군을 포괄할 수 있는 타입을 선택합니다.

왜냐하면 best common type 은 반드시 제공된 후보군들에서 선택되어야 하기 때문에, 공통된 super 타입을 가지는 경우도 있지만, 그렇지 않은 경우도 있습니다.

예를 들자면

let zoo = {new Rhino(), new Elephant(), new Snake()};

이상적으론 우리는 zooAnimal[]로 추론되기를 바라겠지만, 배열에 Animal 타입이 후보군에 없음으로, 타입의 추론이 불가능합니다. 이걸 고치기 위해서, 어떤 타입도 다른 타입의 super 타입이 아닐 경우 명시적으로 super 타입을 적어주어야 합니다.

let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];

만약 best common type이 발견되지 않았을 경우, union 배열 타입이 도됩니다.

Contextual Type

타입스크립트의 몇가지 경우에서 타입 추정은 또한 “다른 방향에서” 작동하기도 합니다. 이건 "contextual typing"이라고 불립니다. Contextual typing은 타입이 타입이 필요한 장소에서 암시가 되었을 때 발생합니다.

window.onmousedown = function(mouseEvent) {
    console.log(mouseEvent.button); // -> Error
}

에러를 발생시키는 위의 코드에서, 타입스크립트 타입체커는 대입연산자의 오른쪽에서 함수 expression 타입을 추론하기위해 winodow.onmousedown함수의 타입을 사용합니다. 이렇게 했을 때, mouserEvent 인자값의 타입을 추론할 수 있었습니다. 만약 함수 expression에서 인자값이 any타입으로 지정이 되었다면 에러가 발생하지 않았을 것입니다.

만약 문맥적으로 타입된 expression이 명시적인 타입정보를 가지고 있다면, 문맥적 타입은 무시됩니다. 만약 아래의 예시와 같이 코드를 작성한다면,

window.onmousedown = function(mouseEvent:any) {
    console.log(mouseEvent.button) // -> no Error
}

함수 expression에 명보가한 타입을 써주면, 문맥적 타입에 오버라이딩 됩니다. 한번 이렇게 한다면, 문맥 타입이 적영되어지지 않았기 때문에 어떤 에러도 발생되지 않습니다.

문맥적 타입은 여러 상황에서 적용됩니다. 보통의 경우 함수 호출의 인자값, 대입연산자의 오른쪽, 타입 assertion, 객체의 맴버, 배열 literals, 그리고 리턴 statement에서 문맥적 타입이 적용이 됩니다.

function createZoo(): Animal[] {
    return [new Rhino(), new Elephant(), new Snake()];
}

위의 예제에서 best common type은 Animal, Rhino, Elephant, 그리고 Snake라는 4개의 타입 후보군이 있습니다. 이들 중에서 Animal은 best common type 알고리즘에 의해 선택받습니다.

2 Likes