Typescript 实现一个带有调用签名和返回方法的接口;这";

Typescript 实现一个带有调用签名和返回方法的接口;这";,typescript,definitelytyped,Typescript,Definitelytyped,前言:我们的团队正在开发一个建立在d3之上的库。因为我们使用的是TypeScript,所以我们也使用DefinitelyTyped中的d3类型。当尝试使用接口(如和许多其他接口)时,会出现以下问题 假设我们有一个包含调用签名和其他属性的接口: let o: Foo<number> = Object.assign(function (arg: number): number { return arg }, { doFoo: function <TThis>

前言:我们的团队正在开发一个建立在d3之上的库。因为我们使用的是TypeScript,所以我们也使用DefinitelyTyped中的d3类型。当尝试使用接口(如和许多其他接口)时,会出现以下问题


假设我们有一个包含调用签名和其他属性的接口:

let o: Foo<number> = Object.assign(function (arg: number): number {
    return arg
}, {
    doFoo: function <TThis>(this: TThis): TThis {
        return this
    }
})
导出接口Foo{
//让我们假设这是身份函数
(arg:T):T;
//让我们假设这将是一个无操作函数
//请注意,这将返回“this”
doFoo():这个;
}
我们如何以类型安全的方式正确实现这样的接口[1]?通过研究,我发现了以下相关问题,所有这些问题都略有不同和/或相当陈旧。我想知道我们是否遗漏了什么,或者是否需要向TypeScript团队提出问题:

  • 注意,接口是我们的外部接口,因此实现它是我们唯一的选择



    考虑到这个问题,我希望实现能够明确地重述所有类型注释。

    在typescript的最新版本中(3.2或3.3不确定是哪个版本),当您声明函数时,您还可以为函数分配额外的属性,Type Script将这些定义为这些属性的定义,而不是抱怨它们没有被定义:

    export interface Foo<T> {
        (arg: T): T;  
        doFoo(): this;
    }
    
    function foo(arg: number) : number {
        return arg
    }
    foo.doFoo = function <TThis extends typeof foo>(this: TThis): TThis { // no polymorphic this in simple functions
        return this
    }
    
    let o: Foo<number> = foo;  // foo is compatible with Foo<number>
    

    谢谢在签名中使用
    this:t这个
    的诀窍是我们似乎缺少的。@IngoBürk还对其添加了一个约束,以使
    foo
    成员可以访问