gpt4 book ai didi

typescript - 推断函数的参数列表

转载 作者:行者123 更新时间:2023-12-04 14:53:13 25 4
gpt4 key购买 nike

我正在努力输入我的函数创建器。我希望 putDefaultKey 具有传递函数的参数。将它们作为一个对象也可以。

const operator = (key: string, value: any) => null

type KeyCreator<G extends any[]> = (...args: G) => string

const createPut = <v, G extends any[] = []>(
operator: (key: string, value: v) => void,
key: KeyCreator<G>,
) => {
return (value: v, ...args: Parameters<KeyCreator<G>>) =>
operator(key(...args), value)
}

const putDefaultKey = createPut<string>(
operator,
(a: string, b: string) => 'something' + a + b,
)

// expected way to call
putDefaultKey('value', 'a string', 'b string')

// having them as an object
putDefaultKey('value', {
a: 'a string',
b: 'b string',
})

putDefaultKey 的参数只是描述为 value: string, ...args: any[] 但是我希望它是 value:字符串,a:字符串,b:字符串

enter image description here

最佳答案

我试图推断所有论点:

const operator = <Value,>(key: string, value: Value) => null

const createPut = <Value, Arg, Args extends Arg[]>(
operator: (key: string, value: Value) => void,
key: (...args: [...Args]) => string,
) =>
(value: Value, ...args: [...Args]) =>
operator(key(...args), value)

const putDefaultKey = createPut(
operator,
<A extends string, B extends string>(a: A, b: B): `something ${A} ${B}` => `something ${a} ${b}`,
)

// value: string, a: string, b: string
putDefaultKey('value', 'a string', 'b string')

为了推断剩余参数...args 值得使用variadic tuple types

有关函数参数推断的更多信息,您可以在我的 article 中找到

Playground

使用显式泛型:


const operator = <Value,>(key: string, value: Value) => null

const createPut = <Value,>() =>
<Arg, Args extends Arg[]>(
operator: <T>(key: string, value: Value) => void,
key: (...args: [...Args]) => string,
) =>
(value: Value, ...args: [...Args]) =>
operator(key(...args), value)

const putWithNumber = createPut<number>()

const putDefaultKey = putWithNumber(
operator,
(a: string, b: string) => `something ${a} ${b}`,
)

putDefaultKey(1, 'a string', 'b string') // ok
putDefaultKey('str', 'a string', 'b string') // error

关于typescript - 推断函数的参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68678615/

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