常见错误
index.ts(1,8): error TS1192: Module '"xxxx"' has no default export.
- 原因
import xx fom 'xx'
// 编译成 CommonJS后,如果"xx"没有default,则会报错
exports.__esModule = true;
var xx = require("xx").default
由于 CommonJS 和 ESModule 规范两者导出方式的不同
- 解决 1
import * as xx from "xx";
// 编译后
exports.__esModule = true;
var xx = require("xx");
- 解决 2
import { xx } from "xx";
// 编译后
exports.__esModule = true;
var xx_1 = require("xx");
console.log(fs_1.xx);
读取本地的tsconfig.json
失败
有时项目嵌套过深,使用命令tsc xxx.ts
的时候默认没有使用本地的配置文件,这时候就需要指定
# 直接指定
tsc -p .
cannot redeclare block-scoped variable
发生原因:
- 可能存在重复定义的全局变量
ERR_UNKNOWN_FILE_EXTENSION
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for
In order to fix this problem, you need to remove "type": "modules"
from the packages.json
file. Once this has been removed, your project should work.
尝试 1
// packages.json
"type": "modules", // 修改为 modules 注意带s结尾
尝试 2
如果方法 1 不行,再
# 项目本地安装
yarn add typescript ts-node -D
// tsconfig 修改
{
"ts-node": {
"target": "ESNext",
"module": "ESNext"
}
}
# 使用新的命令
# 注意此处 node版本为 16.6.2
ts-node --esm ./test.ts
# or
node --loader ts-node/esm ./test.ts
Cannot redeclare block-scoped variable 'xxxx'
HTMLElement | null’ is not assignable to type ‘HTMLElement’. Type ‘null’ is not assignable to type ‘HTMLElement’
发生场景:
当从document.getElementByxx
获取元素时,该 api 返回值可能会是 HTMLElement|null
const drag: HTMLElement = document.getElementById("drag");
解决 1:
添加一个临时变量用作中间值判断
let drag: HTMLElement;
const res = document.getElementById("drag");
if (res) drag = res;
使用mjs
文件时*.d.ts(tsd)
文件不生效
原因
猜测因为*.d.ts
文件是在import
的时候同步引入到项目中的,所以如果import
模块时,使用的模块名称如果是以 *.mjs
来引入,此时将不会触发导入tsd
文件的查找机制,所以不会导入任何*.d.ts
文件
解决
以 node16 为例,因为 node16 版本开始
mjs
文件以 ES6 方式导入cjs
文件以 CommonJS 方式导入*.js
文件则以 package.json 中字段 type 来决定导入方式{"type":"module"}
- 以 ES6 形式处理导入{"type":"commonjs"}
- 以 commonjs 形式处理导入
修改好pacakge.json
文件后,以 js 后缀引入模块,即可触发 ts 导入 tsd 文件的机制
- 方式 1
// 以js后缀形式导入模块
import xxxx from "xxx.js";
- 方式 2
// 通过 node 模式启动项目,可以使用无后缀的形式加载
// node --experimental-specifier-resolution=node index.js
import xxxx from "xxx"
// 同时模块的入口文件添加以下后缀
#!/usr/bin/node --experimental-specifier-resolution=node
// or(建议)
// 修改 package.json 的bin字段
{
"bin":
"scripts":{
"bin":"node --experimental-specifier-resolution=node"
}
}
定义变量报错cannot be compiled under '--isolatedModules' because it is considered
问题
在vue
中使用ts定义变量的时候报如下错误:
cannot be compiled under --isolatedModules
because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.
原因
Typescript 将没有导入/导出的文件视为旧脚本文件。这样的文件不是模块,它们的任何定义都已合并到全局名称空间中。 isolatedModules
禁止此类文件。
将任何导入或导出添加到文件都使其成为一个模块,并且错误消失。
export {}
也是一种方便的方法,可以在不导入任何内容的情况下使文件成为模块。
解决方法
找到tsconfig.json
配置文件,把isolatedModules
字段改为false