使用保留名称的typescript命名空间声明

时间:2017-12-13 18:46:15

标签: typescript types

我正在建立一个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')

我如何声明该依赖?

1 个答案:

答案 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>;  
}

希望其中一件作品适合你;祝你好运!