Capitalize
挑战
实现 Capitalize<T>
将字符串的第一个字母转换为大写,其余部分保持原样。
例如:
type capitalized = Capitalize<"hello world">; // expected to be 'Hello world'
解答
起初,我并不明白这个挑战。我们无法为字符串字面量实现字符大写的通用解答。因此,如
果使用内置的 Capitalize
类型,就很直接了当了:
type MyCapitalize<S extends string> = Capitalize<S>;
我相信,这不是本意。我们不能使用内置的 Capitalize
类型,我们也无法实现通用的解
答。没有这些,我们怎么能让字符大写呢?当然,使用字典!
为了使解答更简单,我只为需要的字符制作了一个字典,即 f
:
interface CapitalizedChars {
f: "F";
}
现在,我们有了一个字典,让我们来推断类型的第一个字符。我们使用经典的条件类型来构 造并推断:
type Capitalize<S> = S extends `${infer C}${infer T}` ? C : S;
现在类型参数 C
有了第一个字符。我们需要检查这个字符是否存在于我们的字典中。如
果是,我们从字典中返回大写的字符,否则我们返回第一个字符且不做任何变更。
interface CapitalizedChars {
f: "F";
}
type Capitalize<S> = S extends `${infer C}${infer T}`
? `${C extends keyof CapitalizedChars ? CapitalizedChars[C] : C}${T}`
: S;
评论