【发布时间】:2021-03-08 08:21:12
【问题描述】:
尝试做这样的事情:
declare function pipe<S, T1>(op1: OperatorFn<S, T1>): T1
declare function pipe<S, T1, T2>(op1: OperatorFn<S, T1>, op2: OperatorFn<T1, T2>): T2
declare function pipe<S, T1, T2, T3>(op1: OperatorFn<S, T1>, op2: OperatorFn<T1, T2>, op3: OperatorFn<T2,T3>): T3
我希望 S 是必需的,但我想推断其余部分 - op1 返回的都是 T1,op2 返回的都是 T2,如果你明白我的意思的话。
我知道我上面的内容不起作用,但完全不知道如何使它在我的定义文件中起作用。
编辑: 我知道我可以这样写:
export interface pipe<S> {
<T1>(op1: OperatorFn<S, T1>): S;
<T1,T2>(op1: OperatorFn<S, T1>, op2: OperatorFn<T1,T2>): S;
}
但我需要在我的接口文件中声明一个函数,然后该函数会遵循该接口。也不知道该怎么做。
编辑#2:
以下似乎很容易解决我的问题:
type pipe<S> = <T1,T2>(op1: OperatorFn<S,T1>, op2?: OperatorFn<T1,T2>) => S
但是我不知道如何在我的定义文件中声明一个符合该类型的函数。
【问题讨论】:
-
IIRC TypeScript 不支持仅提供一种泛型类型,例如
pipe<string>(...),如果你提供任何你必须提供所有。 -
@jonrsharpe - 我知道我写的东西行不通,但我想知道我是否可以用不同的方式来写它,就像我编辑的一样。感谢您的评论!
-
结束投票的人能否建议哪些细节或澄清可能有利于这个问题?我很乐意添加它们。
-
“我不知道如何声明一个符合该类型的函数” - 例如
const impl: pipe<string> = (op) => "hi";。但我认为如果提供了op2,则实际的返回类型应该是T2,否则是T1。也许看看例如github.com/ReactiveX/rxjs/blob/master/src/internal/…. -
@jonrsharpe - 我可以用打字稿写出来,但在定义文件中写声明时遇到了麻烦。
标签: typescript generics inferred-type