我试图有条件地返回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
。但是它应该能够以某种方式从接口中的重载函数分辨出类型。
在此语法问题上的任何帮助将不胜感激! :)
答案 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;
})()
}