在学习的typescript过程中,碰到了一些不明白的declare的用法,先记录,后面再慢慢消化,
在declare的最广为人知的用处就是给第三方js库来做类型定义,让typescript明白js引入的用法,
但是还有一些用法例如,
1.可以将我们写入在分散在各个ts文件中的定义,给统一的放到一个myProject.d.ts中,这样做的好处就是如果我们的后端是nodejs写的,那么可以做到前后端数据共用格式.
在.d.ts文件中,如果我们没有使用了import || export,然后这时候如果我们定义
declare interface A{...}这时候这个这个interface就是全局的,我们在用它的时候不需要import就可以直接使用.
同理对于namesapce也是一样的,例如declare namespace responseTypes{......},这样用的时候也可以直接使用responseTypes.a来用
反之一旦里面用了import || export了,那么我们的declare type..前面也要加上export,不然用不了.
但是如果我们实在想定义成全局的,可以用
declare global {
namespace Express {
//类型融合
// These open interfaces may be extended in an application-specific manner via declaration merging.
// See for example method-override.d.ts (github.com/DefinitelyT…)
interface Request {}
interface Response {}
interface Application {}
}
}
2.第二种用法就是如果我们想去改变第三方库中的类型定义,那么我们可以通过declare的类型融合,比如在Express中,里面暴露出来了Express.Rquest的全局变量,然后如果我们自己再定义一个全局的namesapce Express{interface Request:{{name:string}},这样就可以做到类型的融合,将第三方库中的Request类型给改写掉,正如上面的代码注释所提示的那样,这个功能在我们写中间件的时候比较有用,我们就可以改写request里面的类型定义