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

目录

1,前言

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

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

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

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,得到答案,修改配置项即可:

json 复制代码
{
	"compilerOptions": {
		"noImplicitAny": false
	}
}

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

html 复制代码
<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: 将严格模式应用于所有输入文件,就像它们是以严格模式开始的。


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

json 复制代码
{
	"compilerOptions": {
		"allowJs": true
	}
}

以上。

参考

相关推荐
kyriewen3 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒5 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
To_OC5 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
DigitalOcean6 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年6 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟7 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu117 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue7 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区7 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两7 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js