我正在做一个Http客户。打字稿定义如下所示:
declare namespace Http {
type HttpOptions = ...;
type HttpPromise<T> = ...
function get<T>(url: string, options?: HttpOptions): HttpPromise<T>;
function delete<T>(url: string, options?: HttpOptions): HttpPromise<T>;
}
Run Code Online (Sandbox Code Playgroud)
现在delete这里大喊,因为这是保留字。但是Http.delete('/foo')我的模块上确实有一个方法。
我如何声明该依赖关系?
我猜你不想听“不要那样做”,但这可能是最好的建议。使用保留字作为标识符并不能保证会失败,但是如果某个JavaScript环境在某些方面遇到问题,您就不会感到惊讶。但没关系,我们正在继续进行。
因此,这有点奇怪。我喜欢用带引号的字符串字面就可以用的方法或属性名称的方式,如打字稿规格中提到:
字符串文字可能会用于提供无效标识符的属性名称
但这对函数名称无效,该函数名称必须是有效的标识符。
您显然可以做的一件事是为该函数指定一个有效的名称,然后为其导出一个别名:
declare namespace Http {
export type HttpOptions = ...
export type HttpPromise<T> = ...
export function get<T>(url: string, options?: HttpOptions): HttpPromise<T>;
function del<T>(url: string, options?: HttpOptions): HttpPromise<T>;
export { del as delete }; // no error
}
Run Code Online (Sandbox Code Playgroud)
我说您可以“显然地”做到这一点,因为我找不到任何表明一种或另一种方式的文档。我本以为保留字会在as子句中失败(并且您也无法在其中引用它;这del as "delete"是一个错误),但它似乎可以工作:
Http.get('url') // okay
Http.delete('url') // apparently okay but you probably shouldn't
Http['delete']('url') // okay
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
另一个想法是使用声明合并,但是我再次感到惊讶。首先声明仅具有类型别名的名称空间,然后将其与属性同名的声明常量合并。它既脆弱又奇怪,但对我也有用:
declare namespace Http {
export type HttpOptions = ...
export type HttpPromise<T> = ...
}
declare const Http: {
get<T>(url: string, options?: Http.HttpOptions): Http.HttpPromise<T>;
"delete"<T>(url: string, options?: Http.HttpOptions): Http.HttpPromise<T>;
}
Run Code Online (Sandbox Code Playgroud)
希望其中一件为您服务;祝好运!