gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:20:55 25 4
gpt4 key购买 nike

我正在制作一个 Http 客户端。其 typescript 定义如下所示:

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')

我如何声明该依赖关系?

最佳答案

我猜您不想听到“不要这样做”,但这可能是最好的建议。使用reserved words因为标识符不能保证失败,但是如果某些 JavaScript 环境在某处犹豫不决,您不应该感到惊讶。但没关系,我们会继续下去。


所以这有点奇怪。我喜欢使用带引号的字符串文字 the way you can with a method or property name ,如 TypeScript 规范中所述:

String literals may be used to give properties names that are not valid identifiers

但这不适用于函数名称,它必须是有效的标识符。

你显然可以做的一件事是给函数一个有效的名称,然后 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>;
}

希望其中之一适合您;祝你好运!

关于使用保留名称的 typescript 命名空间声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com