请考虑以下TypeScript代码:
type operator<T> = (input:T) => T
const pipe = <T>(...operators:operator<T>[]) => (input:T):T => operators.reduce((output, f) => f(output), input)
const add2:operator<number> = x => x+2
const times3:operator<number> = x => x*3
console.log(pipe(add2, times3)(1)) //output 9
pipe函数只是将一个操作符的输入通过管道传输到下一个操作符的结果中。
现在考虑运算符类型的新定义:
type operator<T, U> = (input:T) => U
如何重写管道函数以便IDE让我知道是否正确使用了类型?
例如:考虑这两个操作符:
const times3:operator<number, number> = x => x*3
const toStr:operator<number, string> = x => `${x}`
我希望此功能正常工作:
pipe(times3, toStr)(1)
在这里,我希望IDE警告我类型是错误的:
pipe(toStr, times3)(1)
我想不通,先谢了。
4条答案
按热度按时间i7uaboj41#
下面是RxJS的实现方法:
不是很漂亮,但能完成任务。
jdgnovmf2#
我知道这不是完全相同的函数签名,但是......我可以建议使用构建器模式吗?
typescript Playground示例
rbl8hiat3#
Goblinlord's answer是鼓舞人心的,如果运行时递归是关注的,我们可以类型擦除实际的实现,这样我们就可以用迭代代替递归。类型擦除带来了一个风险,即缺陷可能逃脱编译时类型检查,但我认为这是我愿意付出的代价。
rqmkfv5c4#
Array Sort
坚持。*代码
有一些地方我使用了
any
和unknown
,但是它应该是更精确的类型。但是到目前为止,这是我让代码工作的唯一方法。