Typescript传播通用类型约束

时间:2017-10-18 18:52:38

标签: typescript generics functional-programming

给定一般类型:

export interface Mappable<Type, Src> {
    map: <T = Type, D = Src>(f: (a: Src) => D) => T;
}
export type ComposeMapper<T extends Mappable<A, B>, A, B> = (f: (a: B) => B, m: T) => T;

为什么我不能在这样的声明中使用它:

// Error: '(' expected
let _cm: <T extends Mappable> ComposeMapper<T>(f, m) => T;

但是我可以内联类型来声明它:

const _cm: <T extends Mappable<A ,B>, A, B>(f: (a: B) => B, m: T) => T = (f, m) => m.map(f);

类型签名中的泛型类型是否恰好位于参数列表旁边,并且不能应用于其他类型?

1 个答案:

答案 0 :(得分:1)

您有问题的声明看起来像是在尝试创建generic variable,但TypeScript(从v2.5开始)没有这些声明。 TypeScript具有通用的类型,这是ComposeMapper<T>的内容,它具有通用的函数,这是您的上一个_cm声明。

但是,无论如何,我对你的打字感到困惑。 Mappable是一个具有泛型函数map()的接口,它返回T调用者指定的任何类型map()?如何实施?你想要的通用变量似乎返回 T,它只是一个类型,所以无论如何这将是一个语法错误。在最后一行,您致电m.map(f),其中mT并返回T?你会如何实现?我很困惑,我希望你也是。我唯一的建议是让你充实你正在尝试做的事情,并且可以在没有类型的JavaScript中实现它,然后看看你是否可以使用TypeScript来注释它。或者,可能花更多时间阅读the generics section of the handbook?不确定。

无论如何,希望有所帮助;祝你好运!