On this page
Typescript
On this page
ReturnType 으로 타입 좁히기
현상
const test = {aaaa: {getValue: () => 'hello',},bbbb: {getValue: () => 123,},};const foo = (testKey: keyof typeof test) => {const a = test[testKey].getValue(); // a type is number | stringreturn a;};const b = foo('aaaa'); // b type is number | string --> hope, stringconst c = foo('bbbb'); // c type is number | string --> hope, number
b 의 타입은 string
, c 의 타입은 number
로 추론하는 것을 기대했지만, 객체 프로퍼티에서 동일한 이름을 가진 함수의 리턴 타입이 다를 때 해당 함수의 key 값을 명시해줘도 타입을 추론하지 못하는 현상이다.
원인
타입 스크립트에서 testKey
로 접근한 getValue
함수의 리턴 타입을 추론할 수 없기 때문인데 ReturnType
을 이용해 해결하였다.
해결
const test = {aaaa: {getValue: () => 'hello',},bbbb: {getValue: () => 123,},cccc: {getValue: () => true,},dddd: {getValue: () => [] as number[],},};const foo = <T extends keyof typeof test>(testKey: T): ReturnType<typeof test[T]['getValue']> => {return test[testKey].getValue() as any;};const a = foo('aaaa'); // stringconst b = foo('bbbb'); // numberconst c = foo('cccc'); // booleanconst d = foo('dddd'); // number[]
Tags
최근 수정 일: 2022. 6. 27.