请考虑这个例子:
function doCapitalize<Str extends string>(str: Str): Capitalize<Str>
function doCapitalize<Str extends string>(str: Str) {
const capital = str.charAt(0).toUpperCase();
return `${capital}${str.slice(1)}`;
};
const _ = doCapitalize('hello') // "Hello"
type MapCapitalize<List extends string[]> = {
[Prop in keyof List]: Capitalize<List[Prop]>
}
export function capitalize<Input extends string[]>(input: [...Input]): MapCapitalize<Input>
export function capitalize<Input extends string>(input: Input): Capitalize<Input>
export function capitalize(input: string | string[]) {
if (typeof input == 'string') {
return doCapitalize(input);
}
return input.map((s) => doCapitalize(s));
}
const __ = capitalize(['one', 'two']) // ["One", "Two"]
const ___ = capitalize('one') // "One"
Playground个
这个例子类似于@Romain LAURENT Answer,但是,我使用REST元素 [...Input]
进行类型推断.多亏了这一点,您不需要使用as const
断言.
此外,您还可以将 doCapitalize
移出作用域,使其具有单独的功能.
另外@Romain Laurent是第一个,所以我相信他们应该得到接受的答案
我将重载添加到doCapitalize
,因为String.prototype.toUpperCase
返回string
,这是一个超类型.
Capitalized
又是更广泛的类型string
的子类型.因此,您不允许将string
分配到Capitalize
.
请考虑以下示例:
declare let str: string;
declare let capitalize: Capitalize<string>
str = capitalize // ok
capitalize = str // error
正如您可能已经注意到的,str
不能赋值给capitalize
,因为str
可以是任何字符串,capitalize
只能大写,而任何大写的字符串都是字符串,可以赋值给字符串.
这正是daCapitalized
年会发生的事情.
${capital}${str.slice(1)}
只是一个字符串,您希望返回Capitalized<string>
,因此您try 将常规的任意字符串赋给Capitalized
.