let one : string | number
one = 1;
one = 'abc';
type Human = {
think: () => void;
};
type Human = {
think: () => void;
};
type Dog = {
bark: () => void;
};
declare function getType(): Human | Dog;
const creature = getType()
creature.think(); // Property 'think' does not exist on type 'Human | Dog'.
// Property 'think' does not exist on type 'Dog'.
creature.bark(); // Property 'bark' does not exist on type 'Human | Dog'.
// Property 'bark' does not exist on type 'Human'.
type Human = {
think: () => void;
};
type Developer = {
work: () => void;
};
const me: Human & Developer = {
think() {},
work() {},
};
type A = {
output: string;
test: string | number
};
type B = {
output: number;
test: string
};
const obj: A & B = {
output, // Type 'any' is not assignable to type 'never'.
test // only 'string' Type is assignable.
};
데이터의 타입을 알 수 없거나, 될 수 있는 타입이 여러개라고 가정할 때, 구별할 수 있는 단서들을 활용하여 조건문을 통해 데이터의 타입을 좁혀나가는 것.
에러를 최소화하는 방어적인 코드 작성 가능.
type Human = {
think: () => void;
};
type Dog = {
tail: string;
bark: () => void;
};
declare function getType(): Human | Dog;
const creature = getType();
if ("tail" in creature) {
creature.bark();
} else {
creature.think();
}
obj?.propery
comments?.[0]
add?.()
A ?? B
A || B
에서는 A가 falsy값인 경우 바로 B를 반환하는 것에 반해, A ?? B
는 A가 undefined, null이 아니라면 falsy 값이라해도 A를 반환한다.class User {
constructor(private id: string) {}
setId(id: string): string; // 런타임에 제거됨
setId(id: number, radix: number): string; // 런타임에 제거됨
setId(id: string | number, radix?: number): string {
return id.toString(radix);
}
}
let someValue:unknown = 'this is a string'
let strLength: number = (someValue as string).length
type ArrStr = {
[key1: string]: string;
[key2: number]: string;
};
type ArrStrs = Record<string|number, string>