gpt4 book ai didi

typescript - 如何传递通过 TypeScript 中的索引访问的通用值类型?

转载 作者:行者123 更新时间:2023-12-05 05:01:20 25 4
gpt4 key购买 nike

我试图将通用值传递给通过索引访问的类型,但我遇到了语法错误。

我有一个名为 onCreateNode 的函数类型签名在名为 GatsbyNode 的接口(interface)上定义:

interface GatsbyNode {
...
onCreateNode?<TNode extends object = {}>(
args: CreateNodeArgs<TNode>,
options?: PluginOptions,
callback?: PluginCallback
): void
...

我现在创建了一个函数,它也被命名为 onCreateNode我想给它分配 GatsbyNode['onCreateNode'] 的类型同时将值传递给 TNode通用:

export const onCreateNode: GatsbyNode['onCreateNode']<AGenericTypeIWantToPassIn> = ...

但是,我在第一个尖括号 ( <) 处收到语法错误,告诉我这不是有效的 TypeScript。

最佳答案

您正在尝试将一个通用函数 类型转换为一个引用函数的通用类型。这是两种根本不同的泛型,虽然它们是相关的,但编译器并没有真正为您提供在它们之间进行转换的直接机制。参见 this answer以获得更全面的解释;这个问题本质上是在问另一个问题在问什么。

无论如何,最直接的方法是您自己以所需的形式重写类型定义:

type GatsbyNodeSpecific<T extends object = {}> = {
onCreateNode?(args: CreateNodeArgs<T>, options?: PluginOptions, callback?: PluginCallback): void;
}

export const onCreateNode: GatsbyNodeSpecific<AGenericTypeIWantToPassIn>['onCreateNode'] = null!

这绝对可行,但如果 GatsbyNode 的上游定义发生变化,则可能会很乏味并且可能容易出错。


在另一个答案中,我展示了一种骇人听闻的方法来说服编译器采用泛型函数类型并将其转换为泛型类型。对于您的情况,它看起来像这样:

class GenTypeMaker<T extends object = {}> {
getGatsbyNodeSpecific!: <A extends any[], R>(cb: (...a: A) => R) => () => (...a: A) => R;
gatsbyNodeSpecific = this.getGatsbyNodeSpecific!(
null! as NonNullable<GatsbyNode["onCreateNode"]>)<T>()
}
type OnCreateGatsbyNodeSpecific<T extends object> =
GenTypeMaker<T>['gatsbyNodeSpecific'] | undefined;

然后你可以像这样使用这个新类型:

export const onCreateNode2: OnCreateGatsbyNodeSpecific<AGenericTypeIWantToPassIn> = onCreateNode;

这与之前的类型相同。但我怀疑任何使用幻影 class 审查上面代码的人都会对此感到满意,并且手动重写定义的直接(如果冗余)方法可能是更好的方法。

好的,希望对你有帮助;祝你好运!

Playground link to code

关于typescript - 如何传递通过 TypeScript 中的索引访问的通用值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62747325/

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