当你在一个 .d.ts 文件中声明了全局类型时,如果该文件没有引用任何模块,则会出现使用该类型时找不到它的错误。这是因为在没有引入任何模块的情况下,TypeScript 不会识别该文件作为一个模块,并将它视为全局文件。
//global.d.ts
declare global {
type Type1 = {...}
}
declare type Type2 = {}
//demo.ts
let a:Type1 //error 类型Type1不存在
let b:Type2 //success 因为这个文件中没有任何"import"它是一个全局文件
解决方法是,你可以使用 export {} 语句来将该文件变成一个模块,即使它并不导出任何内容。这样,TypeScript 就能正确地识别该文件,并让你在其他文件中使用该文件中声明的全局类型。例如,你可以在 .d.ts 文件中添加以下代码:
export {};
declare global {
type Type1 = {...}
}
declare type Type2 = {}
但是这个时候Type2也就不能在全局用了
为什么有时候在.d.ts文件中写的类型可以在其他地方使用,有时候不行?
//a.d.ts
type aType = {...}
//b.d.ts
import type {cType} from "c"
type bType = {...} & cType
//demo.ts
let a:aType //正常
let b:bType //错误bType不存在
上面的例子你会发现只要.d.ts文件中存在import那么里面的类型和模块就不能在全局使用了
原因就是只要存在import就会将这个文件视为模块,里面声明的类型什么的自然就不能被其他.d.ts 文件获取到了
所以一般我们扩展某个库的某个类型时需要单独创建一个文件来写,因为大多数情况情况下我们需要引用原本的类型来修改,这样会导致同一个文件中原本被公开使用的声明类型变得不可用