You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:36:07