如何修复TypeScript中使用幂等(自扁平化)类型时的类型报错
报错原因
你定义的P<A>条件类型中,使用A extends p<unknown>做判断时,TypeScript 无法反向推导p容器内包裹的实际类型,当A是未确定的泛型参数时,会将map方法的入参类型推断为unknown,因此要求传入的f函数能接收unknown类型参数,和你实际传入的(a:A)=>B类型不兼容,触发报错。
修复方案
调整P<A>的条件类型写法,用infer提取p容器内部的泛型参数,让 TypeScript 能正确关联类型:
type p<A> = { map: <B>(R: (a: A) => B) => P<B> }; type P<A> = // 若A是p容器,提取内部类型U后直接返回p<U>,满足幂等要求 A extends p<infer U> ? p<U> : p<A>; const P = <A,>(x: A) => Object.defineProperty(Object(x), "map", { enumerable: false, configurable: true, value: <B,>(f: (a: A) => B) => P(f(x)) }) as P<A>;
调整后P<P<T>>仍然等价于P<T>,完全符合你要的幂等特性,同时compose函数的类型报错会直接消失。
可选优化(避免类型误判)
如果担心其他带map方法的普通对象被误识别为p类型,可以加一个唯一标记属性:
// 唯一符号标记,不会和普通对象属性冲突 declare const PUniqueTag: unique symbol; type p<A> = { [PUniqueTag]: void; map: <B>(R: (a: A) => B) => P<B>; }; // 剩余的P类型定义和构造函数保持上面的写法即可
内容的提问来源于stack exchange,提问作者Functor
相关产品推荐
相关产品推荐

