TypeScript中能否部分指定函数类型,让其余类型自动推断?
在TypeScript中部分指定函数输入类型并自动推断剩余类型
你的核心需求是仅指定函数的输入类型,让TypeScript自动推断返回类型及关联泛型参数,这在TypeScript中可以通过两种简洁的方式实现:
方法一:直接给泛型工具函数指定输入类型
当前代码中property("id")的泛型参数T因缺乏上下文会被推断为unknown,导致后续类型不匹配。你可以仅给property显式指定输入类型DomainObject,泛型K让TypeScript自动推断:
const idTwice = pipe( property<DomainObject>("id"), // 仅指定T为DomainObject,K自动推断为"id" (s) => s + s // s自动推断为string ); // idTwice的类型自动推断为:(d: DomainObject) => string
这种方式无需额外定义工具函数,直接通过部分指定泛型参数实现需求,完全符合你“仅指定输入类型”的要求。
方法二:封装辅助函数统一约束输入类型
如果需要多次基于同一输入类型构建管道,可以封装一个高阶辅助函数,提前指定输入类型后再传入具体的转换函数:
// 封装一个高阶pipe,先指定输入类型A,再推断B和C const pipeForInput = <A>() => <B, C>(f: (a: A) => B, g: (b: B) => C) => (a: A) => g(f(a)); // 使用时仅指定输入类型DomainObject,其余自动推断 const idTwice = pipeForInput<DomainObject>()( property("id"), (s) => s + s // s自动推断为string );
这种方式适合批量处理同一输入类型的场景,避免重复指定DomainObject。
为什么你之前的尝试未生效
你定义的Map1<A> = <B>(a: A) => B属于高阶类型构造器,但TypeScript不支持在变量类型标注中直接使用这种构造器来实现部分推断——变量的类型标注必须是具体的类型(而非泛型类型的生成器),因此无法通过这种方式达成需求。
内容的提问来源于stack exchange,提问作者David P. Caldwell
相关产品推荐
相关产品推荐

