在 TypeScript 接口上声明函数的多种方式:它们有何不同?

Posted

技术标签:

【中文标题】在 TypeScript 接口上声明函数的多种方式:它们有何不同?【英文标题】:Multiple ways to declare a function on a TypeScript interface: how are they different? 【发布时间】:2015-07-22 15:35:17 【问题描述】:

我见过以多种方式声明的函数属性,如此 TypeScript 界面上的 func1func2 所示:

interface Thing 
    func: (arg:string) => number;
    func2(arg:string): number;

这两者有区别吗?是否存在您会使用其中一个的情况?

This playground link 似乎暗示两者可以互换使用。这有什么限制吗?

【问题讨论】:

我对问题***.com/questions/30056593/…的回答很好地回答了这个问题。 【参考方案1】:

这两者有区别吗

是的。

func: (arg:string) => number;

这个版本意味着它的一个属性。当您尝试声明 overloads 时,这将限制您。

func2(arg:string): number;

这对于函数来说是首选,因为这意味着您可以在事后轻松声明重载(使用接口的开放式性质)

似乎暗示两者可以互换使用

那是因为它们是类型兼容的。并不意味着它们是同一个东西。请参阅下面的属性与方法:

示例

这应该澄清:

interface Thing 
    func: (arg: string) => number;
    func2(arg:string): number;


interface Thing 
    // Overload not permitted
    func: (arg: number) => string; // ERROR!
    // Overload okay 
    func2(arg: number): string;

【讨论】:

以上是关于在 TypeScript 接口上声明函数的多种方式:它们有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 TypeScript 注释中组合多种类型的成员?

在 TypeScript 中使用 import/require 来获取接口声明

使用 TypeScript 声明 (*.d.ts) 和接口的正确方法?

如果函数返回多种类型,我可以声明一个函数返回值吗? [复制]

React Native - 如何在Typescript的接口中声明一个StyleSheet属性?

为函数定义接口,我无权访问该声明