代码之家  ›  专栏  ›  技术社区  ›  fluency03

为什么我可以在typescript中将“function”分配给“interface”?

  •  1
  • fluency03  · 技术社区  · 7 年前

    我在读 Typescript Handbook - Generics ,还有一段代码,如下所示:

    interface GenericIdentityFn {
        <T>(arg: T): T;
    }
    
    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: GenericIdentityFn = identity;
    

    我想知道为什么我可以分配 identity (这是一个 Function )到类型为的变量 GenericIdentityFn (这是一个 Interface )?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Karol Majewski    7 年前

    当接口遵循此模式时:

    interface Callable {
      (): any
    }
    

    据说任何实现这个接口的 可赎回的 或有 呼叫签名 . 这是一种描述函数和方法的奇特方法。这个符号还有其他的变化:

    interface GenericCallable<T> {
      (): T
    }
    
    interface Newable {
      new (): any
    }
    
    interface GenericNewable<T> {
      new (): T
    }
    

    在哪里有 new 关键字是 可更新的 也就是说,使用 新的 关键字(如类)。

    您也可以有一个接口,它是 可赎回的 可更新的 同时。这个 Date 标准库中内置的对象是其中之一:

    interface DateConstructor {
        new(): Date;
        (): string;
    }
    

    长话短说,接口还可以描述函数和 GenericIdentityFn 就是这样一个接口的例子。

        2
  •  1
  •   jo_va    7 年前

    这是因为在typescript中,可以通过带有可调用签名的接口使用括号定义函数类型。

    接口能够描述JavaScript对象可以采用的各种形状。除了用属性描述对象之外,接口还能够描述函数类型。

    Typescript doc 关于这个功能。

    以你为例 identity 与由定义的类型具有相同的签名 GenericIdentityFn 因为接口定义了一个接受类型为的参数的可调用签名 T 返回一个 T .

    推荐文章