我正在建立一个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>;
}
delete
现在正在大喊大叫,因为这是一个保留字。但我的模块上有一个方法Http.delete('/foo')
。
我如何声明该依赖?
答案 0 :(得分:3)
我猜你不想听“不要那样做”,但这可能是最好的建议。使用reserved words作为标识符不会保证失败,但如果某个JavaScript环境出现在某处,您不应该感到惊讶。但没关系,我们正在努力。
所以这有点奇怪。我喜欢使用引用的字符串文字the way you can with a method or property name,如TypeScript规范中所述:
字符串文字可用于提供无效标识符的属性名称
但这对 function 名称不起作用, function 名称必须是有效的标识符。
您可以做的一件事是给函数一个有效的名称然后export an alias to it:
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
}
我说你可以“显然”这样做,因为我找不到任何表明这种或那种方式的文件。我原以为保留字会在as
子句中失败(你也不能在那里引用它; del as "delete"
是一个错误),但似乎有效:
Http.get('url') // okay
Http.delete('url') // apparently okay but you probably shouldn't
Http['delete']('url') // okay
这有帮助吗?
另一个想法是使用declaration merging,但再次使用I'm kind of surprised it works。首先使用类型别名声明命名空间,然后将声明的同名常量与属性合并。它很脆弱而且很奇怪,但它对我也有用:
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>;
}
希望其中一件作品适合你;祝你好运!