以下是函数.这应该只需要stringstring[];就可以变成stringstring[].

export function capitalize(input: string | string[]) {
  const doCapitalize = (str: string) => {
    const capital = str.charAt(0).toUpperCase();
    return `${capital}${str.slice(1)}`;
  };

  if (typeof input == 'string') {
    return doCapitalize(input);
  }

  return input.map((s) => doCapitalize(s));
}

想要完整的完成,就像

const cap = capitalize('capital');
cap === '' //Capital
// and
const cap = capitalize(['capitalA', 'capitalB']);
cap[0] === '' //CapitalA

做了一些playground分中不起作用的东西

推荐答案

请考虑这个例子:

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.

Typescript相关问答推荐

React组件数组及其props 的类型定义

如何基于对象关键字派生类型?

等待的R没有用响应对象展开到R

无法从应用程序内的库导入组件NX Expo React Native

即使子网是公共的,AWS CDK EventBridge ECS任务也无法分配公共IP地址

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

我应该使用什么类型的React表单onsubmit事件?

类型{...}的TypeScript参数不能赋给类型为never的参数''

为什么tsx不判断名称中有"—"的属性?'

具有动态键的泛型类型

如何推断计算逻辑的类型

编剧错误:正在等待Expect(Locator).toBeVisible()

为什么在这个例子中,我把缺少的属性添加到对象中时,TypeScrip没有拾取,如何修复?

如何将v-for中的迭代器编写为v-if中的字符串?

带投掷的收窄类型

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

如何从上传文件中删除预览文件图标?

如何在TypeScript中描述和实现包含特定属性的函数?

基于泛型类型的条件类型,具有条目属性判断

redux-toolkit、createAsyncThunk 错误