我正试图从多个条件类型构建函数的返回类型。
我想作为函数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
}
在此先感谢任何可以指出我所缺少的人。 塞巴
答案 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) }
任何一种方法都应该清除这些错误。
顺便说一句,第二和第三类型参数S
和P
并不是真正需要的,除非我遗漏了一些东西。您可以将S
替换为KindShort<K>
,将P
替换为KindPluralized<K>
,它应该可以为您服务。
希望有所帮助;祝你好运!