【问题标题】:Overload function based on string content in TypeScriptTypeScript中基于字符串内容的重载函数
【发布时间】:2020-08-31 21:40:44
【问题描述】:

假设我有一个接受input 字符串参数的函数。如果input"!" 字符开头,则函数应返回boolean 类型。如果input"?" 字符开头,则函数应返回string[] 类型。

问题是,是否可以在 TypeScript 定义文件中记录此类行为的重载?

【问题讨论】:

  • 否;这是value的问题,而不是type的问题。如果您知道完整的值集,您可以使用string literal types,但我认为您不能使用前缀。

标签: string typescript function overloading


【解决方案1】:

这是不可能的。

打字稿中的字符串可以是常量文字字符串,例如:

const a = "A"

或者它可能是string类型,这意味着它可能有任何内容,例如:

const str = prompt("What is your name?")`

无法定义匹配任何类型模式的字符串类型。


我不知道你想做什么,但这里可能有更好的方法来设计你的 API。


如果您确实知道所有可能性,则可以将它们视为常量字符串。

type Bang = "!A" | "!B" | "!C"
type Question = "?A" | "?B" | "?C"

function doStuff(str: Bang): boolean
function doStuff(str: Question): string[]

function doStuff(str: Bang | Question): boolean | string[] {
  if (str.startsWith("!")) {
    return true
  } else {
    return ['strings', 'here']
  }
}

doStuff('!A') // boolean
doStuff('?A') // string[]

Playground


Typescript 4.1 更新:

Typescript 4.1(2020 年 9 月 18 日刚刚发布测试版)包括对 Template Literal Types 的支持。这使您可以对字符串文字的内容进行强类型化。您现在可以提取部分字符串文字并单独使用它们。

有了这个功能,你的问题可以这样解决:

// Typescript 4.1
function doStuff<
  Prefix extends '!',
  Suffix extends string
>(str: `${Prefix}${Suffix}`): boolean

function doStuff<
  Prefix extends '?',
  Suffix extends string
>(str: `${Prefix}${Suffix}`): string[]

function doStuff<
  Prefix extends '!' | '?',
  Suffix extends string
>(str: `${Prefix}${Suffix}`): boolean | string[] {
  if (str.startsWith("!")) {
    return true
  } else {
    return ['strings', 'here']
  }
}

doStuff('!A') // boolean
doStuff('?A') // string[]
doStuff('bad format') // type error

4.1 Playground

【讨论】:

  • 我已经添加了一个使用常量字符串的示例,如果您知道字符串可能提前的所有可能值。也许这将有助于节省一些时间:)
  • 我不知道您的数据集是什么样的,但是,如果您可以键入像 { id: string, type: 'entity' | 'item' } 这样的数据结构而不是依赖于特定格式的标识符,这将很容易。但这可能对你没有帮助:)
  • 我能够更新我的实现并且不再需要前缀的东西,但我真的很感激你给出了一个直接的答案,你是这个网站上的一个稀有品种。坚持下去,伙计。
  • @HarrisonSmith Typescript 4.1 刚刚发布了测试版,它有一个功能可以满足您最初的要求。以防万一这仍然是您的问题,请参阅我的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多