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

如何在TypeScript中为组合式mixin实现强类型支持?

解决方案

核心问题是你当前定义的pipe函数参数和返回值都声明为any类型,TypeScript无法自动推导链式调用后叠加的mixin类型。可以通过以下两种方式实现类型安全的pipe定义:

方案1:函数重载实现(兼容性好)

该方案针对不同长度的入参做类型重载,足够覆盖绝大多数mixin使用场景,类型推导稳定:

// 可按需扩展更多重载覆盖更长的函数链
function pipe<A, B>(fn1: (a: A) => B): (a: A) => B;
function pipe<A, B, C>(fn1: (a: A) => B, fn2: (b: B) => C): (a: A) => C;
function pipe<A, B, C, D>(fn1: (a: A) => B, fn2: (b: B) => C, fn3: (c: C) => D): (a: A) => D;
function pipe<A, B, C, D, E>(fn1: (a: A) => B, fn2: (b: B) => C, fn3: (c: C) => D, fn4: (d: D) => E): (a: A) => E;

// 运行时实现和原有逻辑一致
function pipe(...funcs: Array<(arg: any) => any>) {
  return (initial: any) => funcs.reduce((acc, fn) => fn(acc), initial);
}

替换原有pipe定义后,你的示例代码即可获得完整类型推导:

const speakMixin = <T,>(obj: T): T & { speak: () => void } => ({
  ...obj,
  speak: () => console.log("I can speak!")
});

const flyMixin = <T,>(obj: T): T & { fly: () => void } => ({
  ...obj,
  fly: () => console.log("i'm flying")
});

const chain = pipe(speakMixin, flyMixin);
const mixed = chain({});

mixed.fly(); // 类型正确推导为() => void
mixed.speak(); // 同样有完整类型提示

方案2:通用可变元组实现(支持任意数量mixin)

如果你使用TypeScript 4.4及以上版本,可以用可变元组递归推导实现不需要手动扩展重载的通用pipe:

type MixinFn = (arg: any) => any;
type ChainResult<Fns extends MixinFn[], Input = unknown> = 
  Fns extends [(input: infer Arg) => infer Ret, ...infer Rest extends MixinFn[]]
    ? ChainResult<Rest, Ret>
    : Input;
type ValidateChain<Fns extends MixinFn[], Input = unknown> =
  Fns extends [(input: infer Arg) => infer Ret, ...infer Rest extends MixinFn[]]
    ? Input extends Arg ? [(input: Input) => Ret, ...ValidateChain<Rest, Ret>] : never
    : [];

function pipe<Fns extends MixinFn[]>(...fns: Fns extends ValidateChain<Fns> ? Fns : ValidateChain<Fns>): (initial: Parameters<Fns[0]>[0]) => ChainResult<Fns> {
  return (initial) => fns.reduce((acc, fn) => fn(acc), initial);
}

该实现可以自动适配任意长度的mixin函数链,无需手动添加重载。

内容的提问来源于stack exchange,提问作者Mister Epic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:15:04