有没有一种方法可以基于参数数组定义返回类型?

时间:2020-08-20 14:01:32

标签: typescript

我想知道是否存在一种创建函数类型定义的方法,该定义将使用函数参数值类型为返回值创建联合类型。

例如,如果我们有一个想要通过附加参数进行增强的配置。

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' ],它已经受到第一个通用类型的限制。

0 个答案:

没有答案