gpt4 book ai didi

typescript - 如何从另一个函数调用一个函数,但保留该特定函数的所有类型

转载 作者:行者123 更新时间:2023-12-05 05:48:37 26 4
gpt4 key购买 nike

我有一个用例,我想注册多个函数,然后从另一个函数调用它们。

这是代码

const combineFunctions = <T extends Record<keyof T, T[keyof T]>>(funcs: T) => {
return (key: keyof T, params: Parameters<T[keyof T]>): ReturnType<T[keyof T]> => funcs[key](params)
}

interface AddNumbersArgumentsType {
a: number
b: number
}

type AddNumbersReturnType = number

const addNumbers = (params: AddNumbersArgumentsType): AddNumbersReturnType => {
return params.a + params.b
}

interface CombineStringWithNumberArgumentsType {
c: string
d: number
}

type CombineStringWithNumberReturnType = string

const combineStringWithNumber = (params: CombineStringWithNumberArgumentsType): CombineStringWithNumberReturnType => {
return params.c + params.d
}

const funcs = {
addNumbers,
combineStringWithNumber
}

const funkies = combineFunctions<typeof funcs>(funcs)

const a = funkies('addNumbers', [{ // Here Paramters util function forces me to send an array
// Here it should autocomplete only correct params from AddNumbersArgumentsType
// But it gives me an option of all arguments all functions take
}]) // => Return type is not gotten correctly, but is a combinations of all functions return types

主要问题是

  • Parameters util 强制我使用数组,而我只想获取参数的类型
  • 自动完成所有函数的所有参数的参数,而不是采用特定于函数的参数类型
  • 返回类型与参数的问题相同

You can see the code running here

提前致谢:)

最佳答案

您需要在内部函数上使用一个额外的类型参数来捕获传入的实际键,并使用它代替 keyof T 来索引到 T。这将烘焙 ts 解析传入的实际函数。

Parameters 返回一个参数元组(可能有更多),但您可以使用元组和剩余参数来解决此问题。

const combineFunctions = <T extends Record<PropertyKey, (...a: any[]) => any>>(funcs: T) => {
return <K extends keyof T>(key: K, ...params: Parameters<T[K]>): ReturnType<T[K]> => funcs[key](...params)
}

///.....
const funcs = {
addNumbers,
combineStringWithNumber
}

const funkies = combineFunctions<typeof funcs>(funcs)

const a = funkies('addNumbers', {a: 1, b: 1}) // all type cheked

Playground Link

关于typescript - 如何从另一个函数调用一个函数,但保留该特定函数的所有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70783662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com