TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错

1,前言

通过 Vite 创建的 Vue3 + TS 项目,根目录下会有 tsconfig.jsontsconfig.node.json 文件,并且存在引用关系:

{
  "compilerOptions": {
  	  // 其他配置项...
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

tsconfig.node.json 文件(配置项比 tsconfig.json 少很多):

{
	"compilerOptions": {
		"composite": true, // 配合 references 配置项使用。
		// 其他配置项...
	},
	"include": ["vite.config.ts"]
}

2,二者关系

1,TS 只能识别 tsconfig.json 为配置文件,不能识别其他的配置文件。

2,随着项目的变的越来越复杂,为了更精细化的控制,需要允许为不同的文件设置不同的配置。

基于上面的2个原因,TS增加一个功能:项目引用(Project References)

2.1,使用

tsconfig.jsontsconfig.node.json 为例,其他的配置文件必须有一个配置项 "composite": true,并且在 tsconfig.json 文件中通过配置项 references 引入,这样 TS 就能识别。

同时,不同的配置文件之间的配置项相互独立,只会影响当前配置文件中的 include 字段。

所以,Vite 创建的 Vue3 + TS 项目中,tsconfig.node.json 只会影响到 vite.config.ts 文件。

3,遇到的问题

3.1,TS 中使用 JS

接手的一个Vue3项目中,在 main.ts 中遇到下面的报错(竟然一直没有解决):

在这里插入图片描述

报错信息:
Could not find a declaration file for module './App.vue'. 'd:/xxx/src/App.vue' implicitly has an 'any' type.ts(7016)

直接搜索错误 implicitly has an 'any' type,得到答案,修改配置项即可:

{
	"compilerOptions": {
		"noImplicitAny": false
	}
}

但后来发现,问题的产生是因为其他同事觉得 ts 麻烦,想直接使用 js,所以做了如下修改:

<script setup lang="ts">
<!-- 改为 -->
<script setup>

此时配置项 "strict": true 就会发挥作用(第5点),

该配置项启用时,包含的一些关键编译选项:

  1. strictBindCallApply: 确保 bind, call, apply 方法的参数类型被正确地类型检查。

  2. strictFunctionTypes: 对函数类型进行严格检查,包括参数和返回值的类型。这意味着函数的参数列表和返回值类型必须完全匹配。

  3. strictNullChecks: 启用严格的空值检查。在这种模式下,TypeScript 编译器会更加严格地检查位置类型和联合类型中可能为 null 或 undefined 的位置。

  4. strictPropertyInitialization: 确保类的非 undefined 属性在构造函数中被初始化。

  5. noImplicitAny: 禁止使用隐式的 any 类型。这有助于避免类型系统的退化,确保类型被明确地声明。

  6. strictTypePredicates: 严格检查类型谓词(如 typeof, instanceof)在类型守卫中的使用。

  7. noImplicitThis: 确保 this 参数被明确地类型化,而不是隐式地推断为 any 类型。

  8. alwaysStrict: 将严格模式应用于所有输入文件,就像它们是以严格模式开始的。


所以更准确的修改,应该是增加下面配置项即可:

{
	"compilerOptions": {
		"allowJs": true
	}
}

以上。

参考

当你在TypeScript项目遇到一些不需要在编译期间检查的问题,或者你想忽略`tsconfig.node.json`文件的一些配置,你可以采取以下步骤来“忽略了tsconfig.node.json”: 1. **临时忽略**:在具体的ts文件,你可以在引入或使用有问题的部分前面加上`/* @ts-ignore */`注释。这会让TypeScript编译器跳过这一行,不会报告错误。 ```typescript /* @ts-ignore */ let problematicVariable = someInvalidValue; ``` 2. **针对文件的忽略**:你也可以在tsconfig.json文件指定`noEmitOnError`属性为`false`,但这意味着所有错误都将被忽略,不是只针对`node.js`环境。这应该作为最后的手段,因为良好的代码质量很重要。 ```json { "compilerOptions": { "noEmitOnError": false } } ``` 3. **文件级别的忽略**:如果你只想在特定的.tstsx文件忽略`tsconfig.node.json`的内容,可以考虑创建一个新的tsconfig.json文件,仅包含你需要的配置,并在你的项目结构明确引用这个新的配置文件。 4. **忽略特定配置**:若要忽略特定的配置项,可以使用`exclude`或`include`数组在`tsconfig.node.json`排除不需要处理的模块或文件。 ```json { "compilerOptions": { "exclude": ["path/to/ignore"] } } ``` 5. **永久性忽略**:如果你确定某个问题永远不会影响你的生产代码,你可以在`tsconfig.node.json`移除对应的配置或直接从项目删除它,但建议在这样做之前先理解其影响。 总之,在处理这种情况时,保持代码清晰、遵循最佳实践是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪天的夏风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值