使用保留名称的打字稿名称空间声明

Kou*_*sha 1 types typescript

我正在做一个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')我的模块上确实有一个方法。

我如何声明该依赖关系?

jca*_*alz 5

我猜你不想听“不要那样做”,但这可能是最好的建议。使用保留字作为标识符并不能保证会失败,但是如果某个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)

希望其中一件为您服务;祝好运!