如何在对象方法上使用TypeScript接口重载

时间:2018-07-16 19:35:11

标签: typescript

我试图有条件地返回KML或GeoJSON(分别为字符串和对象类型),并且我想知道如何通过Object方法上的接口分配类似的函数。

说对象是

const api = {
  getGeometry(url, format) {
    return fetch(`${url}?format=${format}`)
  }
}

具有这样的界面:

interface GeometryRequest {
  (url: string, format: 'kml'): Promise<string>
  (url: string, format: 'geojson'): Promise<GeoJSON.FeatureCollection<any>>
}

因此,我可以将其用作普通功能:

const geometryRequest: GeometryRequest = (url, format) => {
  return fetch(`${url}?format=${format}`)
}

我只是想知道如何以类似的方式将类型分配给对象方法。

以下是我尝试过的几种方法:

getGeometry<GeometryRequest>

getGeometry: GeometryRequest

语法都不正确。

我还在TypeScript Playground上添加了相同问题的简单版本。在操场上,output的类型为:const output: string | number。但是它应该能够以某种方式从接口中的重载函数分辨出类型。

在此语法问题上的任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:2)

函数表达式不能指定多个重载。我们可以通过几种方式之一来模拟效果

使用类型断言来指定函数的公共签名

const a = {
    b: function(c) {
        if (typeof (c) === 'string') {
            return parseInt(c)
        }
        return String(c)
    } as {
        (a: string): number
        (a: number): string
    }
}

使用条件类型根据输入类型确定返回类型,尽管这将在返回值时导致实现问题(comp无法让您分配值,因为它无法确定其安全性)

const a = {

    b<T extends string|number>(c : T ):T extends string ?number: string {
        if (typeof (c) === 'string') {
            return parseInt(c) as any
        }
        return String(c) as any
    }
}

在自执行函数中使用函数声明并返回声明的函数

const a = {
    b: (function () {
        function b(a: string): number
        function b(a: number): string
        function b(c) {
            if (typeof (c) === 'string') {
                return parseInt(c)
            }
            return String(c)
        }
        return b;
    })()
}