Typescript:无法通过多种条件类型定义函数的返回类型

时间:2018-12-14 15:44:34

标签: typescript typescript-typings conditional-types

我正试图从多个条件类型构建函数的返回类型。 我想作为函数buildKindsFor的返回值得到的是一个对象,该对象包含附加到函数的各种可能的键变化。

代码示例会更好,在第一个示例中一切正常:

type KindNames =
  | 'one' | 'two' | 'three'

type KindShort<T extends  KindNames> =
  T extends 'one' ? 'o' : T extends 'two' ? 'tw' : 'th'

type KindPluralized<T extends  KindNames> =
  T extends 'one' ? 'ones' : T extends 'two' ? 'twos' : 'threes'

const buildKindsFor = <
  K extends KindNames,
  S extends KindShort<K>,
  P extends KindPluralized<K>,
>(
  kind: K,
  fn: (kind: KindNames, obj: any) => any,
): {
  [A in K]: () => any
} => {
  throw new Error ('Yet to implement !')
}

但是,当我尝试在returns对象中添加条目时,可以说是简短版本,所有内容都会中断,例如(错误已经结束,当我将鼠标悬停在IDE中时,注释中的一些消息便会出现):< / p>

const buildKindsFor = <
  K extends KindNames,
  S extends KindShort<K>, // Cannot find name K
  P extends KindPluralized<K>, // 'KindPluralized' only refers to a type, but is being used as a value here
>(
  kind: K,
  fn: (kind: KindNames, obj: any) => any,
): {
  [A in K]: () => any // ';' expected, ... and so on
  [B in S]: () => boolean
} => {
  throw new Error ('Yet to implement !')
}

致电buildKindsFor ('one', dummyFn)的预期收益类型应类似于:

{
  one: () => any
  o: () => boolean
  ones: () => string
}

在此先感谢任何可以指出我所缺少的人。 塞巴

1 个答案:

答案 0 :(得分:3)

这是映射类型中的语法错误,导致解析器到处都是不满意的。您不能使用两个索引创建映射类型。

{ [A in K]: () => any, [B in S]: () => boolean } // syntax error!

使用交叉点

{ [A in K]: () => any } & { [B in S]: () => boolean }

或使索引器成为您关心的键的并集:

{ [A in K | S]: A extends K ? (() => any) : (() => boolean) }

任何一种方法都应该清除这些错误。


顺便说一句,第二和第三类型参数SP并不是真正需要的,除非我遗漏了一些东西。您可以将S替换为KindShort<K>,将P替换为KindPluralized<K>,它应该可以为您服务。


希望有所帮助;祝你好运!