當咱們引用了一個js編寫的模塊時會報錯,這時候,若是不在引入的index文件裏面添加.d.ts
描述文件,那麼這個模塊就無法在語義上一致經過.vue
假設導入一個JS的模塊A,而且這個模塊是由npm下載的node
> npm install A;
複製代碼
這時候在ts中使用時發生如下錯誤:typescript
// 當常規的導入A時,會發生如下錯誤
/*沒法找到模塊「A」的聲明文件。「D:/XXXX/XXXX/node_modules/xxxx/index.min.js」隱式擁有 "any" 類型。 Try `npm install @types/A` if it exists or add a new declaration (.d.ts) file containing `declare module 'A';`ts(7016) */
import A from 'A'
複製代碼
這時候若是有提供模塊的描述文件就最好了,能夠直接按照提示下載 npm install @types/A
.不過很惋惜,大部分都是沒有編寫聲明文件的.可是又須要使用到這個模塊時,應該怎麼作.npm
在項目的【根目錄】下定義【模塊相同的名稱】的描述文件A.d.ts
,在描述文件內編寫模塊聲明描述bash
// A.d.ts
declare module '*';
複製代碼
這樣屬於一勞永逸的描述,可是沒法描述到具體模塊內容,所以這種方式僅僅引入的組件沒有任何操做時,好比引入的是第三方開發的vue組件,能夠用這種方式偷懶.post
可是有時候這種方式定義了依舊會報錯,就須要用到下面的方式ui
// A.d.ts
declare module 'A';
複製代碼
// A.d.ts
declare module "A" {
// 添加具體的描述內容
};
複製代碼
modulespa
模塊描述 聲明這個是一個模塊文件,模塊裏面使用export拋出相應的內容code
namespace接口
定義命名空間,一般用的不多
interface
定義接口類型,這點通常配合class使用
定義class類型
定義基礎類型變量
指定定義變量的非基礎類型
interface Person {
// some props
}
type name = keyof Person
複製代碼
這個屬性用來定義全局變量的申明的變量能夠直接調用,這點用來某些直接綁定再window下的變量
declare global {
$:any
}
複製代碼
能夠從這裏查詢到@type包查詢,已經被編寫的文件聲明能夠直接下載