为何引用未定义的onkeydown时TypeScript无报错?
问题描述
我的完整TypeScript文件代码如下:
document.onkeydown = onkeydown
对应的tsconfig.json配置:
{ "compilerOptions": { "allowArbitraryExtensions": true, "target": "ES2021", "lib": [ "ES2021", "dom", "dom.iterable" ], "moduleResolution": "node", "resolveJsonModule": true }, "lib": ["ES2021"], "exclude": ["node_modules", "dist","tmp"] }
明明onkeydown未在该文件中定义,为何tsc没有输出任何错误?
原因及解决方案
这是因为TypeScript默认编译规则不会对未声明变量报错:
- TypeScript默认关闭了
noImplicitAny选项,当使用未声明的变量时,会自动将其类型推断为any,不会触发编译错误。 - 此外,你的
tsconfig.json存在配置冲突:外层的"lib": ["ES2021"]会覆盖compilerOptions内的lib配置,导致dom库未被加载,但这和当前未报错的问题无关,只是会影响DOM相关的类型提示,建议删除外层的lib配置。
要让tsc检测到这个未定义变量的错误,只需在compilerOptions中开启noImplicitAny选项,或者直接开启严格模式(strict: true,包含noImplicitAny等一系列严格检查规则)。修改后的配置示例:
{ "compilerOptions": { "allowArbitraryExtensions": true, "target": "ES2021", "lib": [ "ES2021", "dom", "dom.iterable" ], "moduleResolution": "node", "resolveJsonModule": true, "noImplicitAny": true // 开启该选项检测未声明变量 // 或者使用严格模式:"strict": true }, "exclude": ["node_modules", "dist","tmp"] }
内容的提问来源于stack exchange,提问作者yigal
相关产品推荐
相关产品推荐

