作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解为什么在 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/
我是一名优秀的程序员,十分优秀!