当前位置: 首页 > news >正文

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

目录

  • 1,前言
  • 2,二者关系
    • 2.1,使用
  • 3,遇到的问题
    • 3.1,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}
}

以上。

参考

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Petri网导论学习笔记】Petri网导论入门学习(三)
  • spring模块(六)spring event事件(3)广播与异步问题
  • 【时时三省】tessy 单元测试 集成测试 专栏 文章阅读说明
  • 利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)
  • UE5安卓项目打包安装
  • windows安装docker、elasticsearch、kibana、cerebro、logstash
  • QT--connect的使用
  • Java 集合(数据结构)面试题总结
  • 【MySQL】了解并操作MySQL的缓存配置与信息
  • python AssertionError: Torch not compiled with CUDA enabled
  • 浅谈Spring Cloud:认识微服务
  • vue3+ts+vite搭建脚手架(二)配置eslintprettier
  • SpringBoot接口开发总结
  • Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)
  • 网络安全宣传周 | DNS安全威胁与应对措施分享
  • ----------
  • 【剑指offer】让抽象问题具体化
  • Angular2开发踩坑系列-生产环境编译
  • Docker入门(二) - Dockerfile
  • Golang-长连接-状态推送
  • js操作时间(持续更新)
  • JS学习笔记——闭包
  • vue 配置sass、scss全局变量
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 关于extract.autodesk.io的一些说明
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 【云吞铺子】性能抖动剖析(二)
  • kubernetes资源对象--ingress
  • ​​​【收录 Hello 算法】9.4 小结
  • ​2021半年盘点,不想你错过的重磅新书
  • ​ArcGIS Pro 如何批量删除字段
  • # SpringBoot 如何让指定的Bean先加载
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • $ git push -u origin master 推送到远程库出错
  • (02)vite环境变量配置
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)php新闻发布平台 毕业设计 141646
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十七)Flink 容错机制
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)基于IDEA的JAVA基础10
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 流——流的类型体系简单介绍
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 无限分类
  • .NET 药厂业务系统 CPU爆高分析