【问题标题】:Typescript conditional type on string includes字符串上的打字稿条件类型包括
【发布时间】:2021-08-25 09:49:06
【问题描述】:

我想键入一个函数,该函数将字符串作为输入,如果字符串包含“[]”则返回一个列表,否则返回一个对象。类似的东西:

function func<T = any>(query: string): typeof query extends `${any}[]${any}` ? Array<T> : T {
  if (query.includes('[]')) {
    return [] as T[]
  }
  return {} as T
}

除了不行,函数返回类型只有字符串。

我正在使用最新的 typescript 版本 (4.3.2)。

你能帮我吗?

【问题讨论】:

  • 这是不可能的。并且在打字稿中没有意义。打字稿在运行时不存在。所以你使用一些在 runetime 之前声明的常量,你已经可以看到它,所以你可以知道它是什么类型。或者您获得动态参数(例如来自用户输入),那时没有 ts 并且您不需要这些类型。
  • 这不是用户输入,是的,它是一个常数,我只是希望调用者不必自己输入返回值。

标签: typescript typescript-typings template-literals


【解决方案1】:

你只能用类型参数来做到这一点,而不是真正的函数参数:

function func<S extends string, T = any>(): S extends `${infer A}[]${infer B}` ? Array<T> : T {

}
const testFun = func<'a[]b'>();
const testFun2 = func<'ab'>();

【讨论】:

  • 我发现了,但这意味着调用者必须在类型参数和函数参数中放入相同的字符串。如果不可能,那就太糟糕了
  • 嗯,我不知道。但在这种情况下,您可以使用 typeof。因为它将是字符串文字。 const testFun = func();
  • 并且在该函数的主体中,您将无法推断类型,结果会是什么?
  • 我相信我的函数体尊重我的函数的类型^^
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 2019-05-03
  • 2022-07-21
  • 2022-01-22
  • 2018-04-28
  • 2020-06-25
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多