TypeScript开启allowJs导入JS文件时如何设置对象属性为可选?
TypeScript引入JS文件调用报类型错的可行方案
报错原因:开启allowJs后,TypeScript会自动推导JS导出模块的类型,你的hello函数参数被推导为必填的{ msg: unknown }结构,传入空对象就会触发参数不匹配的类型错误。在不能修改JS文件的前提下,可通过以下3种TS侧调整方案解决:
方案1:全局关闭JS文件类型检查
如果项目不需要对JS文件做类型校验,直接修改tsconfig.json的配置即可,操作最简单:
{ "compilerOptions": { "allowJs": true, "checkJs": false, // 确保该值为false,默认值即为false,若之前手动开启改回即可 // 其余原有配置保持不变 } }
优缺点:全局生效改造成本极低,但会丢失所有JS导入模块的类型提示,不适合正在做JS转TS迁移的项目。
方案2:新增对应模块的类型声明文件(最推荐)
如果需要保留类型校验能力,单独给hello.js加类型声明即可,不会影响全局规则:
- 确保
tsconfig.json的include配置包含了类型声明目录(通常是项目根目录的types文件夹或者src下的@types文件夹) - 在声明目录下新增
hello.d.ts文件,内容如下:
export declare function hello(params: { msg?: string }): void;
优缺点:类型精准,仅作用于对应JS模块,不影响其他TS校验规则,适合该JS模块被多处调用的场景。
方案3:调用处临时类型断言
如果该函数仅被调用一次,不想改配置也不想加额外文件,可以直接在调用处做类型断言:
// app.ts import { hello } from './hello'; // 写法1:调用时直接断言 (hello as (params: { msg?: unknown }) => void)({}); // 写法2:提前定义带类型的变量复用 const typedHello = hello as (params: { msg?: unknown }) => void; typedHello({});
优缺点:无需新增文件或修改全局配置,适合单次调用的场景,多次调用会产生冗余代码。
内容的提问来源于stack exchange,提问作者grace。
相关产品推荐
相关产品推荐

