我想知道是否存在一种创建函数类型定义的方法,该定义将使用函数参数值类型为返回值创建联合类型。
例如,如果我们有一个想要通过附加参数进行增强的配置。
type A = string
type B = string
type C = string
type Config = {
a: A
b: B
c: C
}
type D = string
type DConfig = {
d: D
}
type AdditionalConfig<T> = T & DConfig
type AddAdditionConfig<T, K extends keyof T> = T extends infer U
? {
[a in keyof U]: a extends K ? AdditionalConfig<U[a]> : U[a]
}
: never
const config: Config = {a: 'a', b: 'b', c: 'c'}
基于此,我可以创建一个接受配置并生成补充配置的函数。
const supplementedConfig = supplement<Config>(config, ['a', 'b'])
/*
const supplementedConfig: Promise<{
a: AdditionalConfig<string>;
b: AdditionalConfig<string>;
c: AdditionalConfig<string>;
}>
*/
那太好了,但在上述情况下,我不想c
被包裹。
我找到了一种通过定义其他泛型类型的方法,请参见下面的示例。
declare function supplement2<T, K extends keyof T>(c: T, p: Array<K>): Promise<AddAdditionConfig<T, K>>
const supplementedConfig2 = supplement2<Config, 'a' | 'b'>(config, ['a', 'b'])
/*
const supplementedConfig2: Promise<{
a: AdditionalConfig<string>;
b: AdditionalConfig<string>;
c: C;
}>
*/
但是理想情况下,我不想定义其他泛型类型,而是能够从数组中传递的值(例如[ 'a', 'b' ]
,它已经受到第一个通用类型的限制。