如何在编译器选项设为严格的情况下读取元素?

时间:2019-04-08 22:51:49

标签: typescript

请考虑以下代码。如果我将compilerOptions/strict设置为true,Typescript会抱怨不能将null分配给HTMLElement。

let injectionElement: HTMLElement = document.getElementById("foo");

是否有更好的方法(无需使用any)。

2 个答案:

答案 0 :(得分:2)

将进入选项dom添加到您的editorOptions / lib

"compilerOptions": {
    "lib": ["es2017", "dom"]....

选项strict:true启用TypeScript的所有严格的类型检查选项,使您可以更清楚地了解采用什么方法以及返回的方法,以使您的逻辑清晰。

您当前所捕获的特定规则是strictNullChecks,当变量有可能不持有期望值但不处理其大小写时,该规则将显示错误。

当前,您无法处理传递给id的{​​{1}}与任何元素都不匹配的情况:

getElementById

因此,function yourMethod(id: string): HTMLElement { // getElementById might return HTMLElement or null // depending on whether the Id was found or not const injectionElement = document.getElementById(id); // now check you actually got something if (injectionElement) { return injectionElement; } // otherwise fail and tell the user their // id didn't return anything (Fail fast & fail often) // or other method of handling based on your // context throw new Error(`Invalid element Id: ${id}`) } 的实际类型基本上是injectionElement函数的返回类型,它是getElementById而不仅仅是HTMLElement | null

HTMLElement

答案 1 :(得分:1)

有两种一般的处理方法。

首先,如果您过早知道将找到该元素(例如,如果它是由同一类创建的),则只需创建一个non-null assertion

let injectionElement: HTMLElement = document.getElementById("foo")!;

请注意语句结尾的感叹号:本质上说:“我知道这不是null / undefined”。

第二,如果不能确定(通常不能确定),则必须使用Ali的答案或其他方法执行运行时检查,然后将结果分配给non-nullable变量类型。