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

如何在对象方法上使用TypeScript接口重载,typescript,Typescript,我试图有条件地返回KML或GeoJSON(分别是字符串和对象类型),我想知道如何通过对象方法上的接口分配这样的函数 假设对象是 const api = { getGeometry(url, format) { return fetch(`${url}?format=${format}`) } } 有这样一个界面: interface GeometryRequest { (url: string, format: 'kml'): Promise<string>

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

假设对象是

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>>
}
我只是想知道如何以类似的方式将类型分配给对象方法。

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

getGeometry

getGeometry:GeometryRequest

两者都不是正确的语法

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


如果您对这个语法问题有任何帮助,我们将不胜感激!:)

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

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

const a = {
    b: function(c) {
        if (typeof (c) === 'string') {
            return parseInt(c)
        }
        return String(c)
    } as {
        (a: string): number
        (a: number): string
    }
}
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;
    })()
}
使用条件类型根据输入类型决定返回类型,尽管这会在返回值时导致实现问题(comp不允许您分配值,因为它无法确定该值是否安全)


你确定游乐场链接是正确的吗?我也不清楚你想要完成什么。你能发布一个有什么特别不起作用的snipet吗?天哪,我抓错了URL,把它弄丢了@TitianCernicova dragomirfix@TitianCernicova Dragomir谢谢:)您的第一个选择是非常可取的。在我的TS游乐场链接中,我只是将
作为Test
添加到函数的末尾(也将其重新定义为
b:function(c){
。谢谢!
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;
    })()
}