교차 타입을 더 알아보려면 여기를 클릭하세요
function padLeft(value: string, padding: any) {
// padding이 any 타입으로 되어 있어 숫자나 문자열 둘 다 아닌 인수로 호출할 수 있다.
// 문자열을 받고 왼쪽에 "padding"을 추가합니다.
if (typeof padding === 'number') {
// 만약 'padding'이 숫자라면, 그 숫자만큼의 공백이 왼쪽에 더해질 것입니다.
return Array(padding + 1).join(' ') + value;
}
if (typeof padding === 'string') {
// 만약 'padding'이 문자열이라면, 'padding'은 왼쪽에 더해질 것입니다.
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
console.log(padLeft('Hello world', 4)); // " Hello world"
// any 대신에 유니언 타입을 매개변수를 사용 할 수 있다.
function padLeft(value: string, padding: string | number) {
//...
}
let indentedString = padLeft('Hello world', true); // 컴파일 중에 오류
|
로 타입을 구분한다.interface Bird {
fly();
layEggs();
}
interface Fish {
swim();
layEggs();
}
function getSmallPet(): Fish | Bird {
//...
}
let pet = getSmallPet();
pet.layEggs(); // 성공
pet.swim(); // 오류
pet.fly(); // 오류
Fish
가 있는지 구체적으로 알고 싶을 때let pet = getSmallPet();
if (pet.swim) {
pet.swim();
} else if (pet.fly) {
pet.fly();
} // 둘 다 오류, 공통된 타입을 갖고 있지 않으면 각 프로퍼티에 접근하는 것은 오류가 난다.
// 이 코드를 동작하게 하려면 **타입 단언 as**를 사용하자.
if ((pet as Fish).swim) {
(pet as Fish).swim();
} else if ((pet as Bird).fly) {
(pet as Bird).fly();
}
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
parameterName is Type
는 타입 서술어 이다. 예제에서는 pet is Fish
parameterName
는 반드시 현재 함수 시그니처의 매개변수 이름이여야 한다.// 모든 프로퍼티에 접근이 가능하다.
if (isFish(pet)) {
pet.swim();
} // TS는 pet이 Fish 라는 것을 알고 있다.
else {
pet.fly();
} // Fish가 없다는 것도 알고 있다. 그래서 Bird를 반드시 가지고 있어야 한다.
in
연산자 사용하기in
은 타입을 좁히는데 사용한다.n(문자열 타입 또는 문자열) in x(유니언 타입)
true
라면 선택적 혹은 필수적 프로퍼티n
을 가지는 타입으로 좁히고 false
라면 선택적 혹은 누락된 프로퍼티 n
을 가지는 타입으로 좁힌다.typeof
타입 가드function isNumber(x: any): x is number {
return typeof x === 'number';
}
function isString(x: any): x is string {
return typeof x === 'string';
}
function padLeft(value: string, padding: string | number) {
if (isNumber(padding)) {
return Array(padding + 1).join(' ') + value;
}
if (isString(padding)) {
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
// 이걸 원시값인지 확인하는 함수를 줄일 수 있다. typeof를 통해서!
function padLeft(value: string, padding: string | number) {
if (typeof padding === "number") {
return Array(padding + 1).join(" ") + value;
}
if (typeof padding === "string") {
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
instanceof
타입 가드instanceof
오른쪽은 생성자 함수여야 한다.interface Padder {
getPaddingString(): string
}
class SpaceRepeatingPadder implements Padder {
constructor(private numSpaces: number) { }
getPaddingString() {
return Array(this.numSpaces + 1).join(' ');
}
}
class StringPadder implements Padder {
constructor(private value: string) { }
getPaddingString() {
return this.value;
}
}
function getRandomPadder() {
return Math.random() < 0.5 ?
new SpaceRepeatingPadder(4) :
new StringPadder(' ');
}
// 타입은 'SpaceRepeatingPadder | StringPadder' 이다.
let padder: Padder = getRandomPadder();
if (padder instanceof SpaceRepeatingPadder) {
padder; // 타입은 'SpaceRepeatingPadder'으로 좁혀진다.
}
if (padder instanceof StringPadder) {
padder; // 타입은 'StringPadder'으로 좁혀진다.
}