Typescript 未检测到声明“d.ts”文件中不存在的类型名称的错误
Posted
技术标签:
【中文标题】Typescript 未检测到声明“d.ts”文件中不存在的类型名称的错误【英文标题】:Typescript is not detecting errors for nonexistent type names in declaration "d.ts" files 【发布时间】:2021-01-10 11:54:08 【问题描述】:在 Typescript 游乐场的这个 example 中,我试图在命名空间中使用 不存在的类型,但出现错误:
这是意料之中的。
但在我的本地开发环境中,Typescript 基本上接受任何不存在的类型为any
。
注意:这只发生在d.ts
文件中。
不知道这是否重要,但我使用的是noImplicitAny: true
标志。
查看我的tsconfig.json
文件:
"compilerOptions":
"allowJs": true,
"baseUrl": ".",
"esModuleInterop": true,
"jsx": "react",
"module": "CommonJS",
"moduleResolution": "Node",
"noEmit": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strictNullChecks": true,
"target": "ES6",
"paths":
"@src/*": ["./src/*"],
,
"include": [
"src/**/*",
"functions/src/**/*",
"functions/index.ts"
],
如何让 Typescript 检测到这些错误?
【问题讨论】:
这是.d.ts
文件吗?
@AluanHaddad 是的。对不起,我忘了提这个。将其添加到问题中。
【参考方案1】:
声明文件,即带有.d.ts
的文件,由--skipLibCheck
编译器选项覆盖。
通过指定
"compilerOptions":
"skipLibCheck": true
在你的 tsconfig.json
中,你告诉 TypeScript 不要验证这个文件。
一般来说,您有两个选项来强制验证此文件。
将文件从 .d.ts
重命名为 .ts
。这是最直接的方法,也是侵入性最小的方法。 .ts
只包含声明的文件是完全有效的。
删除上面的"skipLibCheck": true
配置,从而强制在.d.ts
文件中进行类型检查,这是默认行为。
【讨论】:
非常感谢您提供的信息。当我将文件转换为ts
时收到此警告:ES2015 模块语法优于自定义 TypeScript 模块和命名空间。。我会看看我是否可以禁用"skipLibCheck": true
。我激活它是因为@types/styled-components
触发了很多类型冲突。
根据该错误很难判断,因为我看不到整个文件。您应该避免在模块扩充以外的任何上下文中编写declare module "module_specifier"
,因为它会污染全局声明空间。如果你能指点我那个文件,我也许能给你一个指针。
这是我的意图:我希望我的项目类型可以在我的所有源文件中访问,而无需导入它们。例如在test.ts
上,我想做const foo: MY_PROJECT_TYPES.FOO
并且它有效。我发现如何做到这一点的方法是在d.ts
文件上使用declare namespace
。考虑到我在转换为.ts
文件时收到的警告,似乎不建议在d.ts
文件之外这样做。这种模式的最佳实践是什么?谢谢!
也不推荐在.d.ts
文件中使用。 注意,要避免的不是declare namespace
,而是globals。这是一个复杂的话题,我无法在评论中涵盖,但您在各种第三方声明中看到的内容仅在文件不是模块时才是全局的(其中没有*** import
或 export
)。我会说我相信你的意图是有问题的,这与.d.ts
与.ts
无关。您不应该使用类型或值来污染全局命名空间,而迫使您设置 --skipLibCheck
的冲突就是原因。以上是关于Typescript 未检测到声明“d.ts”文件中不存在的类型名称的错误的主要内容,如果未能解决你的问题,请参考以下文章
Typescript 生成带有 `#private;` 字段的声明 d.ts 文件
ts-jest - 运行 jest 时从类型 (.d.ts) 中声明 const 值未定义
使用 TypeScript 声明 (*.d.ts) 和接口的正确方法?