容纳或回避数据集和设置属性类型/可选类型的目的



问:有没有办法全局明确声明,也许通过.tds,在HTMLElement.dataset和setAttribute()的情况下,从Any到字符串的隐式强制转换是可以接受的,或者这些成员一开始就接受Any?我对标记每个案例不感兴趣。

上下文: 我是 TS 的新手,想尝试一个现有的项目/实验/原型,它变得足够大以保证一些类型,但它广泛使用数据集和 setAttribute。

我不在乎我的上述问题包含坏主意©。打字稿 linting 通过捕捉无意的事情为我提供了立竿见影的好处......但只有当我能够将这些案例与故意做的两件事的许多实例区分开来时。

但是,我假设,一般来说,从哲学上讲,可选键入的一个人类目的是允许开发人员区分坏主意和意外。如果我错了,那么我想知道

当然,如果你想逐渐输入你的代码并(希望暂时)放宽一些限制,你可以使用自己的库而不是内置库。 编译器选项可能指定lib值或使用target的默认值,其中包括对内置lib.dom.d.ts声明文件的引用。 您不必使用它,因此您可以选择复制它并根据自己的喜好进行更改。

但是,在这种情况下,由于内置HTMLElement接口不直接包含setAttribute()方法(在the Element interface中定义)或dataset属性(在the HTMLOrSVGElement interface中定义),因此您可以使用声明合并将这些版本添加到HTMLElement中:

// merge into existing HTMLElement interface
interface HTMLElement {
setAttribute(qualifiedName: any, value: any): void;
readonly dataset: { [k: string]: any };
}

(注意:上述方法仅在您的代码已经在全局范围内时才有效。 如果要在模块中编写代码,则可能需要通过declare global语法使用全局扩充。

并使用它:

function useHTMLElement(x: HTMLElement) {
x.innerHTML; // okay
x.setAttribute(123, "hello"); // okay now
x.dataset.foo = 123; // okay now
x.getAttribute(123); // error, didn't override HTMLElement.getAttribute
}

如您所见,现有的HTMLElement定义存在(因为已知innerHTML是一个属性),但是合并的方法和属性按预期工作(它们不会抱怨123不是string)。

好的,希望有帮助。 正如我所说,希望你会考虑在某个时候改变你的代码,使其符合其他人期望的string约束,特别是如果代码将被其他人使用或维护,而不仅仅是个人或玩具项目。 但这取决于你,显然不是你关心的,所以我就不

说了。祝你好运!

链接到代码

最新更新