
자바스크립트는 싱글스레드 언어이고 여기서의 스레드는 콜스택을 의미하며 콜스택에서 함수가 실행/완료되면 해당 함수의 실행 컨텍스트가 콜스택에서 사리진다. 근데 이 함수가 setTiemout이나 Promise를 호출하면 태스크큐 혹은 마이크로 태스크큐에 setTimeout의 호출함수나 Promise의 리턴값이 콜스택이 비워졌을 때 이벤트루프에 의해 콜스택으로 보내진 후 실행된다.
현재까지 내가 알고 있던 부분이다.
아 추가적으로 Promise는 마이크로 태스크큐 그리고 setTimeout은 태스크 큐에 들어가며 마이크로 태스크큐가 태스크큐보다 우선순위가 높다라는 사실까지.
하지만 여러분 그거 아나요.
우리의 브라우저가 언제 렌더링 되는지..?
아니 뭐 리액트에서 state가 변경될 때 뭐 혹은 javascript로 DOM 요소를 직접 조작할 때 이런것도 있지만 조금 더 새로운 대답.
저는 오늘 알았습니다. 이건 아주 재밋고 놀랍더이다.
그건 마로 마이크로 태스크큐의 작업들을 모두 실행한 뒤에도 렌더링이 일어난다고 합니다.
마이크로 태스크 큐 작업들이 끝날 때 마다 즉, 마이크로 태스크큐가 싹 비워질 때 마다도 한 번씩 렌더링 기회를 얻는다고 합니다.
any는 자바스크립트에서 타입스크립트로 넘어가는 과도기와 같은 정말 예외적인 경우에만 사용하는 것이 좋다.
대신 불가피하게 아직 타입을 단정할 수 없는 경우에는 unknown을 사용하는 것이 좋다.
unknown은 모든 값을 할당할 수 있는 top type으로 어떠한 값도 할당할 수 있다.
그러나 any와 다르게 바로 사용은 불가능하며 type narrowing하여 사용할 수 있다.
function doSomething(callback:unknown){
if (typeof callback === 'function'){
callback()
}
throw new Error('callback은 함수여야 합니다.')
}
인덱스 시그니처란 객체의 키를 정의하는 방식을 의미한다.
type Hello = {
[key: string]: string
}
const hello: Hello = {
hello: 'hello',
hi: 'hi
}
hello['hi'] // hi
hello['안뇽'] // undefined
[key: string]이 부분이 인덱스 시그니처다.
근데 뭔가 딱봐도 키가 너무 열려 있어서 별로 타입스크립트 쓰는 이유가 없어보인다.
객체의 키는 동적으로 선언되는 경우를 최대한 지양해야한다.
그 방법이 아래의 방법이다.
type Hello = Record<'hello' | 'hi', string>
const hello: Hello = {
hello: 'hello',
hi: 'hi',
}
Record<key, value>를 사용하면 객체의 타입에 각각 원하는 키와 값을 넣을 수 있다.
타입스크립트의 핵심 원칙 중 하나는 타입 검사가 값의 형태에 초점을 맞춘다는 것입니다.
이를 "덕 타이핑" 또는 "구조적 서브타이핑"이라고 부르기도 합니다.
Object.keys(hello).map((key)=> {
//Element implicity has an 'any' type because expression of type 'string'
//can't be used to index type 'Hello'
const value = hello[key]
return value
})
분명 hello 객체의 key를 Object.keys로 잘뽑았고 그 키로 객체에 접근했는데 에러가 발생했다.
이러한 문제는 왜 발생할까?
Object.keys(hello)가 반환하는 타입은 string[]이다.
타입스크립트의 핵심 원칙은 타입 체크를 할 때 그 값이 가진 형태에 집중한다는 것이다.
type Car = { name: string }
type Truck = Car & { power: numer }
function horn(car: Car){
console.log(`${car.name}이 경적을 울립니다 뿅뿅`)
}
const truck: Truck = {
name: '비싼차',
power: 100
}
horn(truck)
자바스크립트는 객체의 타입에 구애받지 않고 객체의 타입에 열려 있으므로 타입스크립트도 이러한 자바스크립트의 특징을 맞춰줘야한다.
즉, 타입스크립트는 이렇게 모든 키가 들어올 수 있는 가능성이 열려있는 객체의 키에 포괄적으로 대응하기 위해 string[]으로 타입을 제공하는 것이다.