【问题标题】:How to use TypeScript interface overloads on an Object Method如何在对象方法上使用 TypeScript 接口重载
【发布时间】:2018-07-17 04:14:26
【问题描述】:

我正在尝试有条件地返回 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&lt;GeometryRequest&gt;

getGeometry: GeometryRequest

语法都不正确。

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

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

【问题讨论】:

  • 您确定游乐场链接是正确的吗?我也不清楚你想要完成什么。你能发布一个具体不起作用的片段吗?
  • 射击,我抓住了错误的 URL 并丢失了它@TitianCernicova-Dragomir
  • 已修复。 @TitianCernicova-Dragomir 谢谢 :)

标签: typescript


【解决方案1】:

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

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

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;
    })()
}

【讨论】:

  • 您的第一个选项非常可取。在我的 TS Playground 链接中,我只是在函数末尾添加了 as Test(也将其重新定义为 b: function(c) {。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2018-02-19
  • 2021-06-12
  • 2021-09-16
  • 2019-11-26
  • 1970-01-01
  • 2020-08-08
  • 2020-09-29
相关资源
最近更新 更多