gpt4 book ai didi

Typescript 推断的泛型类型在条件类型中未知

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

我无法理解为什么在 createRoute 的参数中没有将 data 属性正确推断为 FeatureFlagData。基本上我想要实现的是根据 canActivate 数组中的项目(因为它实现通用 GuardWithData)。我在这里错过了什么?另外,是否有更好的方法来实现同样的目标?

下面是一些示例代码:

interface Guard {
canActivate: () => boolean
}

export interface GuardWithData<D> extends Guard {
data?: D;
}

export type DataType<T> = T extends GuardWithData<infer D> ? D : unknown;

class FeatureFlagGuard implements GuardWithData<FeatureFlagData> {
canActivate() { return true; };
}

interface Route {
canActivate: any,
data?: object
}

interface FeatureFlagData {
featureFlag: string;
}

type ExtractGuardData<A extends Route> = A extends {
canActivate: GuardWithData<infer U>,
}
? Route & { data: U }
: never;

function createRoute<U extends Route>(route: ExtractGuardData<U>) {
return route;
}

createRoute({
canActivate: FeatureFlagGuard,
data: {} // <-- This type is to unknown, rather than the expected FeatureFlagData
})

最佳答案

interface Guard {
canActivate: () => boolean
}

这意味着具有 canActivate 属性的对象是一个 bool 函数。您将 FeatureFlagGuard 传递给 createRoute 的方式,看起来您希望 FeatureFlagGuard 成为 bool 函数,而不是带有 的对象code>canActivate 属性。

interface Guard {
(): boolean
}

export interface GuardWithData<D> extends Guard {
(data?: D): boolean;
}

const FeatureFlagGuard: GuardWithData<FeatureFlagData> =
(data?: FeatureFlagData) => true;

interface Route<D> {
canActivate: GuardWithData<D>,
data?: D
}

interface FeatureFlagData {
featureFlag: string;
}

function createRoute<D>(route: Route<D>) {
return route;
}

createRoute({
canActivate: FeatureFlagGuard,
data: {}
})

关于Typescript 推断的泛型类型在条件类型中未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62180882/

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