typeof null === ‘object’
null, undefined는 strictNullChecks 여부에 따라 달라짐.
never 타입으로 선언된 변수의 범위는 공집합이기 때문에 아무런 값도 할당할 수 없음.
ex) const x: never = 12; 는 불가능함.
교집합 시 모든 걸 포함함.
interface Person {
name: string;
}
interface Lifespan {
birth: Date;
death?: Date;
}
type PersonSpan = Person & Lifespan;
const ps: PersonSpan = {
name: 'Alan Turing',
birth: new Date('1912/06/23'),
death: new Date('1954/06/07'),
}; // OK
// 유니온은 앞의 교집합과 같이 동작하지 않음. 값의 key가 없기 때문.
type K = keyof (Person | Lifespan); // Type is never
// 다음과 생각하면 편함
keyof (A&B) = (keyof A) | (keyof B) // "name" | "birdh" | "death"
keyof (A|B) = (keyof A) & (keyof B) // never
// extends 키워드를 쓰는 것이 더 일반적임.
그림 2-7 그림 참고
extends K, T
function getKey<K extends string>(val: any, key: K){
//...
}
function sortBy<K extends keyof T, T>(vals: T[], key: K): T[]{
//...
}
interface Point {
x:number;
y:number;
}
const pts: Point[] = [{x: 1, y: 1},{x: 2, y: 0}];
sortBy(pts, 'x'); // 정상. 'x'는 'x'|'y'를 상속 (즉, keyof T)
sortBy(pts, 'y'); // 정상. 'y'는 'x'|'y'를 상속
sortBy(pts,Math.random() < 0.5 ? 'x' : 'y');
// 정상, 'x'|'y' 는 'x'|'y'를 상속
sortBy(pts,'z');
// ~~~ "z" 형식의 인수는 "x' | 'y' 형식의 매개변수에 할당될 수 없습니다.
ts는 길이도 체크함.
const triple: [number,number,number] = [1,2,3];
const double: [number,number] = triple;
// ~~~~ [nunber,number,number] 형식은
// [nunber,number] 형식에 할당할 수 없습니다.
// 'length'속성의 형식이 호환되지 않습니다.
// 3 형식은 2 형식에 할당할 수 없습니다.
typeof
와 타입스크립트 타입은 다름. js 타입이 더 단순함.interface Person {
first: string;
last: string;
}
const first: Person['first'] = p['first'];
// 타입선언(:) 또는 단언문(as) 다음에 나오는 심벌은 타입인 반면, = 다음에 오는 모든 것은 값이다.
type PersonEl = Person['first' | 'last']; // Type is string
type Tuple = [string, number, Date];
type TupleEl = Tuple[number]; // Type is string | number | Date
function email(
{person, subject, body}: {person: Person, subject: string, body: string}
) {
// ...
}
타입 단언보다 안전성이 체크되는 타입 선언을 쓰자.
const a : Person
(선언), as const
(단언)const a = <Person>{}
→ 이건 리액트 컴포넌트로 인식되어 잘 쓰지 않음.화살표 함수 타입 정의하기
const people: Person[] = ['alice', 'bob', 'jan'].map(
(name): Person => ({name})
);
타입 단언이 필요한 경우
// !도 단언문임.
const elNull = document.getElementById('foo'); // Type is HTMLElement | null
const el = document.getElementById('foo')!; // Type is HTMLElement
단언문은 A가 B의 부분 집합인 경우만 사용해 변환 가능. 임의의 타입 간 변환 x.
단언문 무조건 성공하는 법 : unknown을 포함해 단언하기. 모든 타입은 unknown의 서브타입임.
const el = document.body as unknown as Person; // OK
String.prototype
// String은 자기 자신이 유일한 존재임.
> "hello" === new String("hello")
false
> new String("hello") === new String("hello") false
// 기본형에 할당하면 기존 속성이 사라짐.
> x = "hello"
> x.language = 'English' 'English'
> x.language
undefined
interface Room {
numDoors: number;
ceilingHeightFt: number;
}
const r: Room = {
numDoors: 1,
ceilingHeightFt: 10,
elephant: 'present',
// ~~~~~~~~~~~~~~~~~~ Object literal may only specify known properties,
// and 'elephant' does not exist in type 'Room' };
const obj = {
numDoors: 1,
ceilingHeightFt: 10,
elephant: 'present',
};
const r: Room = obj; // OK