【问题标题】:Make a TypeScript type which represents the first letter of a string type创建一个 TypeScript 类型,它代表字符串类型的第一个字母
【发布时间】:2021-09-28 13:13:06
【问题描述】:

我有一个函数可以输出传递给它的字符串的第一个字母。就我而言,我知道可能的值是什么,假设是硬编码或通过泛型,并希望函数的返回类型与返回的字母完全相同,因此我可以将其传递给以后的函数。

我实际上找到了一种相当不优雅的方法,但我感觉它不稳定,并且可能无法在未来的 TypeScript 版本中工作,因为${infer FirstLetter} 在技术上可以代表任意数量的字符……它就是这样发生的TypeScript 目前只能找到第一个:

type Speed = 'fast' | 'slow' | 'medium';
type SpeedShort = Speed extends `${infer FirstLetter}${string}`
  ? FirstLetter
  : never;

作为一个函数声明,它可能看起来像:

declare function firstLetter<Letters extends string>(
  string: Letters,
): Letters extends `${infer FirstLetter}${string}`
  ? FirstLetter
  : never;

【问题讨论】:

  • could technically represent any number of characters… 你为什么会这样想?
  • @布鲁克乔丹。你的功能没问题。 IT 将在未来的版本中工作。
  • 如果您不知道传递给函数的显式值,则无法根据其返回值分配显式类型。我认为这是类型和值的目的之间的错误期望。应将类型视为对象中可能存在的值的子集。
  • @Roberto Zvjerković 因为在推论中我看不出它为什么不能决定选择“fas”并将字符串保留为“t”而不是只选择一个字母。
  • @captain-yossarian 你怎么知道?

标签: typescript typescript-types


【解决方案1】:

以下是您声明此类类型的方式:

type Speed = 'fast' | 'slow' | 'medium'
type SpeedShort = 'f' | 's' | 'm'

下面是你如何实现转换功能:

function firstLetter(speed: Speed): SpeedShort {
    switch (speed) {
        case 'fast': return 'f'
        case 'slow': return 's'
        case 'medium': return 'm'
    }
}

playground

我知道要编写更多代码。 但是,这段代码仍然表达了意图,并由编译器正确验证,不会留下人为错误的地方(即更改一种类型而不更改映射函数将导致编译时错误)。

【讨论】:

  • 我有一个很好用的功能,这不是问题。在检查错误(例如长度为零的字符串)时,有许多不同的方法可以在 JavaScript 中获取字符串的第一个字符。我只是想确保这些类型是并且将永远是,运行良好。所以我同意这种方式会很好用,但由于我已经有一种方法可以在当前的 Typescript 系统中工作,我想知道是否有人可以提出更可靠的打字实现。
  • @BrookJordan 这种方法有什么不足之处?
  • 抱歉,我指的是我的解决方案不够可靠,但是在阅读了其他人的 cmets 之后,它看起来可能比我预期的更可靠。至于你的答案,它是可靠的。问题是我正在寻找一种更通用的方法来推断,该方法适用于任何给定类型,因此我不必为每个用例创建新的首字母函数。
猜你喜欢
  • 2019-10-14
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多