请考虑以下代码。如果我将compilerOptions/strict
设置为true
,Typescript会抱怨不能将null分配给HTMLElement。
let injectionElement: HTMLElement = document.getElementById("foo");
是否有更好的方法(无需使用any
)。
答案 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变量类型。