如何获取实例化泛型类型参数的泛型函数的参数类型?

4

我的目标是将泛型函数的参数类型提取到一个新的泛型类型中,以便稍后使用:

// we have a given function like this:
function genericFunction<T>(a: T) {
  return a;
}

type genericParamsType = Parameters<typeof genericFunction>; // this will resolve to a type of [unknown]
// I would like to achieve something like this:
// type genericParamsType<PassDownType> = Parameters<typeof genericFunction<PassDownType>>;
// but that is a syntax error

// if it would work, I could the following:
// const newparams: genericParamsType<string> = ["hello"] // correct
// const newparams2: genericParamsType<number> = ["hello"] // error because its not a string

游乐场


你的解决方案需要多灵活?仅限于特定函数吗?还是适用于带有一个通用参数的任何函数?或者适用于任意数量的通用参数的任何函数? - Lesiak
1个回答

2
TypeScript 4.7引入了实例化表达式,因此您的原始想法不再是语法错误。实例化表达式允许泛型函数被具体类型的泛型类型参数实例化。因此,genericParamsType可以写成以下形式:
type genericParamsType<T> = Parameters<typeof genericFunction<T>>;

虽然这仍然不能提供真正通用的解决方案,因为我们仍然必须在具体实现上使用 typeof 类型查询,但它足以涵盖问题中概述的用例:
// we have a given function like this:
function genericFunction<T>(a: T) {
  return a;
}

type genericParamsType<T> = Parameters<typeof genericFunction<T>>;

const newparams: genericParamsType<string> = ["hello"] // OK
const newparams2: genericParamsType<number> = ["hello"] // Type 'string' is not assignable to type 'number'.

"

Playground

" 可以翻译为 "

{{链接1:游乐场}}

"。

太棒了!甚至完全是我在它存在之前使用的语法。非常直观。 - josias
1
是的,@josias - 当他们首次宣布实例化表达式时,我对它的真正用例有些怀疑,但由于它允许像你这样的用例,它开始在我心中生根发芽。我希望它可以在没有实现的通用函数签名的一般情况下工作,但是也许在未来的TS版本中会发生这种情况。 - Oleg Valter is with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接