Ambient模块中declare module的类型使用限制及解决方法
TypeScript模块声明的那些事儿:任意导入和类型支持的区别
我来给你掰扯清楚TypeScript里模块声明的这个细节——不同写法的差别可不小:
简化声明:随便导入啥都不报错
当你写 declare module "my-module"; 这种极简声明的时候,相当于给TypeScript开了个“绿灯”:这个模块我认了,它能导出任何内容,你别管具体是什么,允许我导入就行。
比如下面这段代码完全没问题,TS不会揪着你问 funcFuncFunc 到底是啥:
import {funcFuncFunc} from 'my-module'; funcFuncFunc(10); // 这里毫无报错,TS默认放行
但这个写法有个致命短板:没法用导入的内容当类型
别高兴太早,这种简化声明有个坑——你不能把从这个模块导入的标识符当作类型来用。比如试试下面这段:
import {BlahBlahBlah} from "my-module"; let a: BlahBlahBlah; // 直接报错:"Cannot use namespace 'BlahBlahBlah' as a type"
为啥?因为TS只知道这个模块能导出东西,但完全搞不清导出的是值还是类型,自然不敢让你把它当作类型注解来用。
要支持类型?得显式定义模块内容
想解决这个问题也简单,别用极简声明了,把模块里的类型明确写出来:
declare module "my-module" { type BlahBlahBlah = any; }
这么一写,TS就清楚 BlahBlahBlah 是个类型了,之前的类型注解代码就能正常运行啦!
内容的提问来源于stack exchange,提问作者Aleksandr Motsjonov
相关产品推荐
相关产品推荐

