有過TS開發經驗的人都知道。TS中的interface的做用。有些狀況下,做爲function的類型依據,是很是有用的。node
好比有個有個處理用戶數據的方法,須要在某個function內提取用戶的用戶頭像和用戶暱稱。首先要定義用戶數據結構的interface、git
interface IUserData {
nickName:string,
headerImage:string
}
export {IUserData}複製代碼
以後再在某處方法內定義好參數類型es6
class Main{
......
......
static getUserData(data:IUserData){
data.nickName=.....
data.headerImage=.....
}
}
class UserD implements IUserData{
protected nickName:string;
protected headerImage:string;
construct(){
}
}
interface IFriendUserData extends IUserData{
friendName:string,
}複製代碼
這是一種很常見的使用interface的方法,並且也方便了類型的擴展。這種interface 的接口定義是必要的,目的除了類型上的區分,還能夠起到擴展的目的。github
但另一種interface的定義。雖然不要,可是又顯得不那麼重要。ajax
當一個ajax的數據返回的格式以下:typescript
{
"apiname":"getusername",
"code":"123",
"result":{
"code":"123",
"data":{
"username":"shincat",
"userinfo":"from changzhou",
"userage":"30",
"list":[1,2,3,4]
}
},
"history":[1,2,3,4,5]
}複製代碼
爲了方便TypeScript 環境的類型識別,咱們須要專門爲這個數據結構定義一套interface。目前的數據結構爲3層,三種數據結構。npm
interface Iuserdata {
readonly apiname?:string;
readonly code?:string;
readonly result?:IData5;
readonly history?:Array<number>;};
interface IData5 {
readonly code?:string;
readonly data?:IData6;
};
interface IData6 {
readonly username?:string;
readonly userinfo?:string;
readonly userage?:string;
readonly list?:Array<number>;
};
export {Iuserdata,IData5,IData6}複製代碼
以上便可。面對ajax請求返回,只須要使用Iuserdata
參數類型json
const result:Iuserdata= await request.get(URLINK);
console.log(result.result.data.username);複製代碼
以上接口定義是必要的,可是理論上不會存在須要被擴展的可能,因此又顯得不是那麼重要。可是有時候,當數據結構變得複雜時,好比:api
{ "apiname":"getusername",
"code":"456",
"result":{
"code":"123",
"data":{
"username":"shincat",
"userinfo":"from changzhou",
"userage":"30",
"list":["2"],
"stylelist":[
{
"a":1,
"b":{
"name":"",
"age":"",
"time":""
},
"c":{
"logtime":[
{
"beginAt":"2019-01-01",
"endAt":"2019-01-03"
}
]
},
"d":{
"raisein":[
{
"beginAt":"2019-01-01",
"endAt":"2019-01-03"
}
]
},
"e":{
"stlonein":[
{
"beginAt":"2019-01-01",
"endAt":"2019-01-03"
}
]
}
}
]
}
},
"history":[{ "time":"34" }]
}
複製代碼
在typescript工程內咱們也得爲他定義一套interface。 這就比如是bash
很顯然,這還不是相對極端的狀況,可是咱們仍是得爲這一套interface花掉太多的精力。一旦ajax返回的數據的數據結構發生變化,咱們可能又得重定義一套,很顯然咱們在這裏花掉了太多時間和精力,而牢牢是爲了應付ajax的一次數據返回。因而咱們可能會很是想念es6 或者es5弱類型的無拘無束。或者你也能夠直接用any
類型,但這一點都不TS不是麼?因此你須要以下這些interface。
interface Ickindex {
readonly apiname?:string;
readonly code?:string;
readonly result?:IData0;
readonly history?:Array<IData10>;
};
interface IData10 {
readonly time?:string;
};
interface IData0 {
readonly code?:string;
readonly data?:IData1;
};
interface IData1 {
readonly username?:string;
readonly userinfo?:string;
readonly userage?:string;
readonly list?:Array<string>;
readonly stylelist?:Array<IData2>;
};
interface IData2 {
readonly a?:number;
readonly b?:IData3;
readonly c?:IData4;
readonly d?:IData6;
readonly e?:IData8;
};
interface IData8 {
readonly stlonein?:Array<IData9>;
};
interface IData9 {
readonly beginAt?:string;
readonly endAt?:string;
};
interface IData6 {
readonly raisein?:Array<IData7>;
};
interface IData7 {
readonly beginAt?:string;
readonly endAt?:string;
};
interface IData4 {
readonly logtime?:Array<IData5>;
};
interface IData5 {
readonly beginAt?:string;
readonly endAt?:string;
};
interface IData3 {
readonly name?:string;
readonly age?:string;
readonly time?:string;
};
export {Ickindex,IData10,IData0,IData1,IData2,IData8,IData9,IData6,IData7,IData4,IData5,IData3}複製代碼
const result:Ickindex= await request.get(URLINK);
console.log(result.result.data.stylelist[0].c.logtime[0].beginAt);複製代碼
當有20-30個接口的時候,重複以上簡直就是災難,大概996門就是這麼來的。
因而我寫了一個jsonterface的npm包,經過一行j2i
命令實現了批量的導出。
或者npm上搜索:jsontointerface
使用方法呢
npm install --save-dev jsontointerface複製代碼
j2i init
或者
npx j2i init複製代碼
而後在你的項目目錄下就會出現一個 j2i.json
的配置文件;
和一個j2i
的目錄, 目錄的大體結構
-root--
|- j2i/
|- node_modules/
|- package.json
|- j2i.json
複製代碼
j2i.json 爲json2interface的配置文件 數據結構爲:
{
"files":{
"filepath":"j2i",
"filepathto":"D"
},
"options":{
"readonly":true,
"toD":true
}
}複製代碼
有一個名爲 username.json
的json文件,數據結構爲:
{
"apiname":"getusername",
"code":"456",
"result":{
"code":"123",
"data":{
"username":"shincat",
"userinfo":"from changzhou",
"userage":"30",
"list":["2"]
}
},
"history":[{
"time":"34"
}]
}複製代碼
將 其放置在 j2i
目錄下。 以後直接運行
j2i
或者
npx j2i
複製代碼
根據以上j2i.json
的配置文件的配置項,將在D
目錄下生成一個 Iuserdata.d.ts
的文件。這個文件的內容爲:
interface Ickindex {
readonly apiname?:string;
readonly code?:string;
readonly result?:IData0;
readonly history?:Array<IData2>;
};
interface IData2 {
readonly time?:string;
};
interface IData0 {
readonly code?:string;
readonly data?:IData1;
};
interface IData1 {
readonly username?:string;
readonly userinfo?:string;
readonly userage?:string;
readonly list?:Array<string>;
};
export {Ickindex,IData2,IData0,IData1}複製代碼
同理。你能夠在j2i目錄裏面放上100個json的文件。這些json文件能夠經過你用postman等工具實現對服務端接口的一次訪問就能夠得到,並確保裏面的數據結構是完整的,以後將其內容保存爲一個json文件,放在j2i目錄裏面就能夠啦~
後面的內容是我照抄個人git上的描述的,關於配置信息可在github或者npmjs上去查看,但願對你們有幫助啦~也但願你們能多多關注個人微信公衆號啦。