Typescript 此接口语法是否定义函数签名

Typescript 此接口语法是否定义函数签名,typescript,Typescript,我看到一些代码如下: export interface SomeInterface<T> { <R>(paths: string[]): Observable<R>; <R>(Fn: (state: T) => R): Observable<R>; } 导出接口SomeInterface{ (路径:字符串[]):可观察; (Fn:(状态:T)=>R):可观察; } 我搜索了TS文档,但似乎没有找到好的解释。因此

我看到一些代码如下:

export interface SomeInterface<T> {
    <R>(paths: string[]): Observable<R>;
    <R>(Fn: (state: T) => R): Observable<R>;
}
导出接口SomeInterface{
(路径:字符串[]):可观察;
(Fn:(状态:T)=>R):可观察;
}
我搜索了TS文档,但似乎没有找到好的解释。因此,我想问:

  • 这种接口是否定义了具有这两个签名之一的函数?我的理解正确吗?如果是,文档在哪里

  • 我认为您对代码意图的理解是正确的,因为它试图为一组函数定义一个接口,这些函数产生
    可观察的
    。然而,虽然接口是有效的,但我认为任何函数都不能满足该接口的要求,因为它必须同时满足两个函数签名。对于一个具体的示例,请尝试将以下内容粘贴到


    要实现这一点,您需要将
    SomeInterface
    拆分为两个独立的通用函数接口。

    调用签名中类型参数的使用是有文档记录的

    该接口描述了一个。它需要实现两个签名。你可以这样做:

    function f<R>(paths: string[]): Observable<R>;  // not really possible
    function f<R>(func: (state: number) => R): Observable<R>;
    function f<R>(something: string[] | ((state: number) => R)): Observable<R> {
      if (Array.isArray(something)) {
        return { someField: null as any as R }; // see? can't do it!
      }
      return { someField: something(2) };
    }
    const someInterfaceNumber: SomeInterface<number> = f;
    
    函数f(路径:字符串[]):可观察;//不太可能
    函数f(func:(状态:number)=>R):可观测;
    函数f(something:string[]|((state:number)=>R)):可观察{
    if(Array.isArray(某物)){
    返回{someField:null作为任意R};//看到了吗?不能这样做!
    }
    返回{someField:something(2)};
    }
    常量SomeInterfaceEnumber:SomeInterface=f;
    
    这很好。希望有帮助



    *好的,你实际上不能这样做,但那只是因为第一个签名说它是一个通用函数,它接受一个
    string[]
    参数,并为调用方想要的任何
    R
    输出一个
    可观察的
    。。。这是不可能做到的。您没有任何类型为
    R
    的对象可返回。所以你可以把它伪装成空的(
    null作为任意的R
    ),但我会担心任何试图使用该接口的人。

    它只是一个重载函数。您当然可以实现它。我认为Michael的回答更准确,这种接口不能用作函数类型变量的类型注释。编译时,ts会向您发送错误消息。但是它对我非常有帮助,您为出现在函数签名前面的类型参数提供了文档链接。我在上面向您展示了如何创建接口类型的值。这是一个重载函数的签名,@MichaelWu说它不可能是正确的。他所表现出来的只是他没有实施,并不是说它无法实施。
    Types of parameters 'paths' and 'func' are incompatible.
      Type '(state: string) => any' is not assignable to type 'string[]'.
        Property 'push' is missing in type '(state: string) => any'.
    
    function f<R>(paths: string[]): Observable<R>;  // not really possible
    function f<R>(func: (state: number) => R): Observable<R>;
    function f<R>(something: string[] | ((state: number) => R)): Observable<R> {
      if (Array.isArray(something)) {
        return { someField: null as any as R }; // see? can't do it!
      }
      return { someField: something(2) };
    }
    const someInterfaceNumber: SomeInterface<number> = f;