index signature 는 {[key : T] : U}형식으로, 객체가 <key, vlaue>형식이며 key와 value의 타입을 정확하게 명시해야하는 경우 사용할 수 있다.
다음 food 의 타입을 생각해보자
const food = {
'짜장면': '중식',
'파스타': '양식'
};
이런 경우 food: { [ key: string ]: string }
와 같이 type 을 표현 할 수 있다.
기존의 type 을 특정 type 으로 바꾸기 위해서 type assertion 을 사용 할 수 있다. 예시를 보자
type User {
name: string;
age: number;
height: number;
}
const user = new User('cha', 20, 180);
const tmp = Object.entries(user).map(([key, _]: [string, any]) => {
( ... func1(key as User) ))
};
위의 경우에서 Object.entries 의 [key, value] type 이 [string, string | number | string[]]
이기 때문에 [key, _] 에 [string, any]
타입을 지정해 주었지만, 자세히 말하자면 실제 key 의 type 은 keyof User
이다. 때문에 안에서 사용 할때 실제 타입인 User 를 지정해서 사용하고 싶다면 func1(key as User)
에서 처럼 as
를 통한 type assertion 을 사용하면 된다.
[ts type assertion] https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions
keyof <>
는 키(key)를 타입으로 가져오는 데 사용되고, key in keyof <>
는 키(key)에 대한 맵핑된 타입을 생성하는 데 사용된다
type keyInKeyOf = {[ key in keyof <>]: string };
type keyOf = keyof <>;
Record
는 TypeScript에서 제공하는 유틸리티 타입 중 하나로, 특정 타입의 키와 특정 타입의 값을 가진 객체를 생성하는데 사용됩니다. Record 는 다음과 같이 정의된다.
type Record<K extends keyof any, T> = {
[P in K]: T;
};