【问题标题】:declare function with overrides with one required and multiple inferred generics用一个必需的和多个推断的泛型声明具有覆盖的函数
【发布时间】: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&lt;string&gt;(...),如果你提供任何你必须提供所有。
  • @jonrsharpe - 我知道我写的东西行不通,但我想知道我是否可以用不同的方式来写它,就像我编辑的一样。感谢您的评论!
  • 结束投票的人能否建议哪些细节或澄清可能有利于这个问题?我很乐意添加它们。
  • “我不知道如何声明一个符合该类型的函数” - 例如const impl: pipe&lt;string&gt; = (op) =&gt; "hi";。但我认为如果提供了op2,则实际的返回类型应该是T2,否则是T1。也许看看例如github.com/ReactiveX/rxjs/blob/master/src/internal/….
  • @jonrsharpe - 我可以用打字稿写出来,但在定义文件中写声明时遇到了麻烦。

标签: typescript generics inferred-type


【解决方案1】:

因为T1 没有在函数内部以外的任何地方使用,它允许你这样做。

这可以通过type T2 = typeof op2 等轻松扩展。

function pipe<S>(op1: OperatorFn<unkown, unknown>): S {
   type T1 = typeof op1 extends TEST<S, infer U> ? U : never
}

您还必须扩展类型 S 以匹配 OperatorFn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2018-05-15
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多