말그대로 특정 타입에 붙이는 alias이다. 그냥 특정 타입에 이름을 붙인 것이다.
그러니까
이 코드에서는 { x: number; y: number; } 이 타입에 Point라는 alias를 붙인 것이고
이 코드에서는 number | string이라는 Union 타입에 alias를 붙인 것이다.
Type Alias는 말 그대로 alias 뿐이기 때문에 이미 존재하는 다른 타입에 alias를 붙일 수도 있다.
그러니까 이 코드에서처럼 UserInputSanitizedString은 그냥 string 타입에 대한 alias로 현재 sanitizeInput 함수의 리턴 타입으로 string 대신 UserInputSanitizedString이라고 alias를 쓴 것을 볼 수 있다.(기본 타입에 대해 굳이 이렇게 alias를 붙일 필요가 있을지는 모르겠다..)
인터페이스는 object type에 이름을 붙이는 것이다.
그럼 type alias와 Interface는 무슨 차이가 있는 걸까? 이 지점이 좀 어려운데 일단 각각을 확장하는 방법은 다음과 같다.
하지만 새로운 필드를 추가하는 것은 Interface는 가능하지만 type alias는 안 된다.
즉, (1) 언제라도 Interface는재정의할 때 기존의 것에 프로퍼티를 추가하게 되지만 type alias의 경우 재정의라는 것이 불가능하다.
그리고
(2) type alias의 경우 기본 타입(primitives)을 가리키는 것이 가능하지만 Interface의 경우는 불가능하다. (하지만 여전히 굳이 기본 타입에 별칭을 붙이는 게 왜 필요할지는 모르겠다..)
공식 문서에서는 특별한 경우가 아니면
You’ll see that there are two syntaxes for building types: Interfaces and Types.
You should prefer interface. Use type when you need specific features.
Interface를 사용하기를 권장하고 있다.