Flow类型能否在方法链中收紧实例的方法定义?
细化Flow/TypeScript中pipe方法的类型定义
没问题,不管是Flow还是TypeScript都完全支持你要的需求——把pipe方法里的any替换成函数实际返回的具体类型,核心就是用泛型把Hole实例的内部值类型和pipe接收的函数的输入输出类型关联起来。我给你具体拆解两种方案:
Flow 实现方案
首先,你需要给Hole类添加一个泛型参数,用来表示它内部存储的值的类型。然后pipe方法再用另一个泛型参数来标注传入函数的返回类型,这样就能完全替代any,实现类型的自动推导:
class Hole<T> { // 用泛型T标注内部值的类型 value: T; constructor(value: T) { this.value = value; } // 泛型U表示传入函数的返回类型 pipe<U>(fn: (value: T) => U): Hole<U> { return new Hole(fn(this.value)); } }
这样用的时候,Flow会自动推导每个步骤的类型:
const numberHole = new Hole(123); // 这里pipe接收的函数把number转成string,Flow会自动推断U是string const stringHole = numberHole.pipe(num => num.toString()); // stringHole的类型是Hole<string>,完全替代了之前的any
如果你之前尝试收紧类型没成功,大概率是没给Hole类加上泛型约束,或者没在pipe方法里关联输入输出的泛型参数。
TypeScript 实现方案
TypeScript的泛型支持和Flow思路一致,甚至更灵活。写法几乎类似,只是语法细节略有不同:
class Hole<T> { private value: T; constructor(value: T) { this.value = value; } pipe<U>(fn: (value: T) => U): Hole<U> { return new Hole(fn(this.value)); } }
举个实际使用的例子,TypeScript会自动做类型推断:
const boolHole = new Hole(true); const numHole = boolHole.pipe(b => b ? 1 : 0); // numHole的类型是Hole<number>,编辑器会自动提示这个类型,类型检查也会生效
这种写法不仅能替代any,还能让类型检查贯穿整个pipe调用链,避免类型错误。
内容的提问来源于stack exchange,提问作者Soichi Takamura
相关产品推荐
相关产品推荐

