Capitalize의 사용 예시 코드로 다음이 있습니다.
type Getters<Type> = {
[Property in keyof Type as `get${Capitalize<string & Property>}`]: () => Type[Property]
};
interface Person {
name: string;
age: number;
location: string;
}
type LazyPerson = Getters<Person>;
위의 코드는 LazyPerson에 대한 타입을 다음처럼 자동으로 구성해 줍니다.
type LazyPerson = {
getName: () => string;
getAge: () => number;
getLocation: () => string;
}
위의 코드에서 설명할 내용이 산더미 같지만 일단 집중하고자 하는 것은 Capitalize 입니다. Capitalize는 TypeScript로 작성되지 않은 Native 코드입니다. Capitalize가 Native로 작성되었지만 TypeScript로도 작성될 수 있는데요. TypeScript로 작성된 Capitalize은 다음과 같습니다.
type UpperMap = {
a: "A";
b: "B";
c: "C";
d: "D";
e: "E";
f: "F";
g: "G";
h: "H";
i: "I";
j: "J";
k: "K";
l: "L";
m: "M";
n: "N";
o: "O";
p: "P";
q: "Q";
r: "R";
s: "S";
t: "T";
u: "U";
v: "V";
w: "W";
x: "X";
y: "Y";
z: "Z";
};
type MyCapitalize<S extends string> =
S extends `${infer First}${infer Rest}`
? `${First extends keyof UpperMap ? UpperMap[First] : First}${Rest}`
: S;
type A = MyCapitalize<"hello">; // "Hello"
type B = MyCapitalize<"typescript">; // "Typescript"
type C = MyCapitalize<"안녕?">; // "안녕"
type D = MyCapitalize<"Hello">; // "Hello"
