这是一个普通的管道功能。 JS:
DT[, Months_spent := length(seq.Date(Date_col[1L], Date_col, by = "month")), by = ID]

如何在打字稿中用类型编写相同的东西?
即。当我管道功能时,我可以从当前的最后一个函数的返回类型中获取类型信息
答案 0 :(得分:2)
遗憾的是,这在 Typescript 中目前是不可能的,除非您准备为您可能想要的每个长度定义 pipe
,这似乎不太有趣。
但你可以靠近!
此示例使用受 Promise
启发的 then
来链接函数,但您可以根据需要对其进行重命名。
// Alias because TS function types get tedious fast
type Fn<A, B> = (_: A) => B;
// Describe the shape of Pipe. We can't actually use `class` because while TS
// supports application syntax in types, it doesn't in object literals or classes.
interface Pipe<A, B> extends Fn<A, B> {
// More idiomatic in the land of FP where `pipe` has its origins would be
// `map` / `fmap`, but this feels more familiar to the average JS/TS-er.
then<C>(g: Fn<B, C>): Pipe<A, C>
}
// Builds the `id` function as a Pipe.
function pipe<A>(): Pipe<A, A> {
// Accept a function, and promise to augment it.
function _pipe<A, B>(f: Fn<A, B>): Pipe<A, B> {
// Take our function and start adding stuff.
return Object.assign(f, {
// Accept a function to tack on, also with augmentations.
then<C>(g: Fn<B, C>): Pipe<A, C> {
// Compose the functions!
return _pipe<A, C>(a => g(f(a)));
}
});
}
// Return an augmented `id`
return _pipe(a => a);
}
const foo = pipe<number>()
.then(x => x + 1)
.then(x => `hey look ${x * 2} a string!`)
.then(x => x.substr(0, x.length) + Array(5).join(x.substring(x.length - 1)))
.then(console.log);
foo(3); // "hey look 8 a string!!!!!"
Check it out on Typescript Playground
这是一个灵活大小定义的示例,它的容量有限,但对于大多数应用程序来说应该足够大,并且您始终可以按照该模式对其进行扩展。我不建议使用它,因为它非常混乱,但我想我会把它放在一起是为了好玩并展示这个概念。
在幕后,它使用您的 JS 实现(以类型安全的方式实现它是可能的,但很费力),而在现实世界中,您可能只是将其放在 JS 文件中,将此签名更改为 {{1 }},并删除实现。 TS 不会让你在一个文件中做到这一点而不会有任何抱怨,所以我只是手动将它连接起来作为示例。
注意:
declare function