답: 4 잉여 속성 체크는 타입 단언문을 사용할 때에 적용되지 않는다.
interface Options {
title: string;
darkMode?: boolean;
}
const o = {darkmode: true, title: 'Ski Free'} as Options; // 정상 잉여속성 체크 적용되지 않음
interface SaveAction {
type: 'save';
//...
}
interface LoadAction {
type: 'load';
//...
}
type Ation = SaveAction | LoadAction;
1) Action 유니온을 인뎅싱 하면 타입 반복 없이 ActionType을 정의할 수 있다.
type ActionType = Action['type'];
정답: "save" | "load"
2) Pick을 사용하여 type 속성을 가져옴
type ActionRec = Pick<Action, 'type'>;
정답: type 속성을 가지는 인터페이스 {type: "save" | "load"}
정답: extends
extends를 이용하면 제너릭 매개변수가 특정 타입을 확장한다고 선언할 수 있다.
앞에 나온 Pick의 정의는 extends를 사용해서 완성할 수 있다. 타입 체커를 통해 기존 예제를 실행해 보면 오류가 발생한다.
type Pick<T,K> = {
[k in K]: T[k]
// ~ 'K' 타입은 'string | number | symbol' 타입에 할당할 수 없습니다.
}
K는 T 타입과 무관하고 범위가 너무 넓다 K는 인덱스로 사용될 수 있는 string | number | symbol 이 되어야 하며 실제로는 범위를 조금 더 좁힐 수 있다. K는 실제로 T의 키의 부분 집합, 즉 keyof T가 되어야한다.
타입이 값의 집합이라는 관점에서 생각하면 extends를 '확장'이 아니라 '부분 집합' 이라는 걸 이해하는 데 도움이 된다.
type Pick<T, K extends keyof T> = {
[k in K] : T[k]
}
정답: keyof 연산자는 객체 타입에서 객체의 키 값들을 숫자나 문자열 리터럴 유니언을 생성한다.
interface Options {
width: number;
height: number;
color: string;
label:string;
}
type OptionsKeys = keyof Otions;
//타입이 "width" | "height" | "color" | "label"
type Rocket = {[property: string]: string};
답: 3번 값의 타입은 어떤 것이든 될 수 있다.
interface Outer {
inner: {
x: number;
}
}
const o: Readonly<Outer> = { inner: { x: 0 }};
o.inner = { x: 1 };
// 읽기 전용 속성이기 때문에 'inner'에 할당할 수 없습니다.
o.inner.x = 1; // 정상
1.타입 별칭과 인터페이스는 모두 제너릭이 가능하다.
2. 인터페이스는 타입을 확장할 수 있으며 타입은 인터페이스를 확장할 수 있다.
3. 인터페이스는 유니온 타입 같은 복잡한 타입도 확장할 수 있다.
4. 인터페이스는 타입에 없는 몇가지 기능이 있다. 그중 하나가 바로 보강 이다.
정답: 3 인터페이스는 유니온 타입 같은 복잡한 타입을 확장 할 수 없다. 타입과 &를 사용해야
한다.
type Input = {...}
type Output = {...}
type NamedVariable = (Input | Output) & {name: string};
인터페이스는 이런거 없음