typescript 編寫類型聲明文件注意事項(xiàng)

注:本文主要內(nèi)容來自于官方文檔的理解

當(dāng)我們需要為第三方不支持ts的庫編寫類型聲明文件時桨醋,本文包含一些需要避免的不太建議的用法姐呐,本文主要內(nèi)容來源在此處: Do's and Don'ts

不要使用 Number String Boolean Symbol Object等類型崭庸,而是使用 number string boolean symbol object 等類型属划,因?yàn)榇髮戦_頭的都是js中的自執(zhí)行的基本包裝類型涧至,而非原始類型诅蝶,比如 var a = 'ddd'中自執(zhí)行的 a = new String('ddd');退个,很怪不募壕,

在使用泛型時,泛型參數(shù)一定要被使用

interface Something<T> {
  name: string;
}

上述泛型接口例子语盈,泛型T沒被使用舱馅,這會導(dǎo)致當(dāng)我們傳入不同類型時,產(chǎn)生的變量可以被互相賦值刀荒,貼出官方FAQ例子

interface Something<T> {
  name: string;
}
let x: Something<number>;
let y: Something<string>;
x = y;

x 和 y可以被互相賦值代嗤,這很怪異,泛型根本沒有作用缠借,正確的使用泛型應(yīng)該是這個姿勢才對

interface Something<T> {
  name: T;
}

否則干毅,就別強(qiáng)行使用泛型了。泼返。硝逢。

當(dāng)函數(shù)沒有返回值時,使用void 而不是 any

function test(): any{
}
const a = test();
a.run();

ts 不會報(bào)錯绅喉,但是本身趴捅,test函數(shù)沒有返回值,自然a.run() 應(yīng)該報(bào)錯才對霹疫,所以,不要偷懶把該寫void的地方寫成any W劢妗丽蝎!

回調(diào)函數(shù)中,無需使用可選參數(shù) 因?yàn)楹瘮?shù)參數(shù)在被賦值時膀藐,被賦值的函數(shù)參數(shù)數(shù)量本身是可以缺少的

function test(callback: (num: number) => void) {
    callback(5);
}

test((num: string) => { // 報(bào)錯
    console.log("What");
});

test(() => { // 通過
    console.log("What");
});

本例我們的test函數(shù)在聲明需要的callback參數(shù)時屠阻,聲明了callback 有一個number類型參數(shù),ts中進(jìn)行函數(shù)兼容性判斷時额各,函數(shù)參數(shù)是雙向協(xié)變的(通過嚴(yán)格模式可以設(shè)置成逆變)国觉,返回值是協(xié)變的(ps:為什么這么設(shè)計(jì)呢,大概是因?yàn)槲覀兤綍rjs中使用map reduce filter時也并沒有三個參數(shù)全用上虾啦。因?yàn)閺?qiáng)行寫上簡直是無用功麻诀。。)傲醉,

所以蝇闭,在回調(diào)函數(shù)中使用可選參數(shù)是多余的,因?yàn)榧硬患佑脖希际强蛇x的呻引。另外可選參數(shù)的意義是會根據(jù)參數(shù)數(shù)量的不同而產(chǎn)生不同的調(diào)用,用在這里也不合適

interface Fetcher {
    getObject(done: (data: any, elapsedTime?: number) => void): void;
}

interface Fetcher {
    getObject(done: (data: any, elapsedTime: number) => void): void;
}

兩者等價吐咳。

和上面同理逻悠,編寫僅在回調(diào)函數(shù)參數(shù)數(shù)量上面不同的函數(shù)重載是沒有意義的

declare function beforeAll(action: () => void, timeout?: number): void;
declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void;
// 無需寫重載
declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void;

上面兩行和下面一行等價元践!

函數(shù)重載過程中,要按照參數(shù)復(fù)雜度從小到大排序童谒,因?yàn)閠ypescript在匹配函數(shù)類型時是按照聲明順序匹配的

declare function fn(x: HTMLDivElement): string;
declare function fn(x: HTMLElement): number;
declare function fn(x: any): any;

按照一個包含另一個的從小到大順序排列

當(dāng)函數(shù)重載的返回值類型相同時单旁,使用可選參數(shù)而不是函數(shù)重載

// 錯誤
interface Example {
    diff(one: string): number;
    diff(one: string, two: string): number;
    diff(one: string, two: string, three: boolean): number;
}
// 正確
interface Example {
    diff(one: string, two?: string, three?: boolean): number;
}

為什么呢惠啄,當(dāng)返回值類型相同時使用函數(shù)重載會導(dǎo)致兩個問題慎恒,

  1. 賦值給回調(diào)函數(shù)時因?yàn)槟硞€重載滿足條件而錯誤賦值
function fn(callback: (a: string, b: number, c: number) => void) { }

interface Example {
    diff(one: string): number;
    diff(one: string, two: string): number;
    diff(one: string, two: string, three: boolean): number;
}

var x: Example;
fn(x.diff);

我們定義了fn函數(shù),接受的回調(diào)函數(shù)有一個string 兩個number類型的參數(shù)撵渡,當(dāng)我們對diff函數(shù)使用重載時融柬,我們可以將diff函數(shù)賦值給callback回調(diào)函數(shù),因?yàn)榈谝粋€重載滿足一個string參數(shù)趋距,這顯然使我們不想見到的粒氧,因?yàn)榈诙€重載第三個重載都不滿足callback函數(shù),是用可選參數(shù)可以避免此問題

function fn(callback: (a: string, b: number, c: number) => void) { }

interface Example {
    diff(one: string, two?: string, three?: boolean): number;
}

var x: Example;
fn(x.diff);

ts報(bào)錯节腐,這樣才是我們想要的

2.當(dāng)我們顯式傳入undefined時外盯,函數(shù)重載會導(dǎo)致報(bào)錯,

interface Example {
    diff(one: string): number;
    diff(one: string, two: string): number;
    diff(one: string, two: string, three: boolean): number;
}
var x: Example;
x.diff("something", true ? undefined : "hour")

當(dāng)時用重載時翼雀,ts會報(bào)錯undefined不能賦值給string饱苟,

interface Example {
    diff(one: string, two?: string, three?: boolean): number;
}
var x: Example;
x.diff("something", true ? undefined : "hour")

使用用可選參數(shù)可以避免此問題,因?yàn)槲覀兾磦鲄?shù)時默認(rèn)的值就是undefined狼渊,因此箱熬,顯式傳入undefined應(yīng)該與未傳表現(xiàn)一致才對,這才符合js的運(yùn)行過程狈邑,可選參數(shù)可以解決這個問題城须。

當(dāng)函數(shù)重載時,只有參數(shù)類型不一樣時米苹,使用聯(lián)合類型

// 錯誤
interface Moment {
    utcOffset(b: number): Moment;
    utcOffset(b: string): Moment;
}
// 正確
interface Moment {
    utcOffset(b: number|string): Moment;
}

因?yàn)槭褂寐?lián)合類型可以既接收單一類型的值糕伐,也可以接收聯(lián)合類型的值,函數(shù)重載只能接收單一類型的值

function fn(x: number|string) {
    return moment().utcOffset(x);
}

函數(shù)重載時傳入聯(lián)合類型x報(bào)錯蘸嘶,是用聯(lián)合類型時可以傳入聯(lián)合類型良瞧,

最后希望大家為優(yōu)秀的第三方庫多做貢獻(xiàn),一起豐富typescript生態(tài)训唱!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莺褒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雪情,更是在濱河造成了極大的恐慌遵岩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尘执,居然都是意外死亡舍哄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門誊锭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來表悬,“玉大人,你說我怎么就攤上這事丧靡◇∧” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵温治,是天一觀的道長饭庞。 經(jīng)常有香客問我,道長熬荆,這世上最難降的妖魔是什么舟山? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卤恳,結(jié)果婚禮上累盗,老公的妹妹穿的比我還像新娘。我一直安慰自己突琳,他們只是感情好若债,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拆融,像睡著了一般拆座。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠息,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音孕索,去河邊找鬼逛艰。 笑死,一個胖子當(dāng)著我的面吹牛搞旭,可吹牛的內(nèi)容都是我干的散怖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肄渗,長吁一口氣:“原來是場噩夢啊……” “哼镇眷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翎嫡,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欠动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體具伍,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翅雏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了人芽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望几。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萤厅,靈堂內(nèi)的尸體忽然破棺而出橄抹,到底是詐尸還是另有隱情,我是刑警寧澤惕味,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布楼誓,位于F島的核電站,受9級特大地震影響赦拘,放射性物質(zhì)發(fā)生泄漏慌随。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一躺同、第九天 我趴在偏房一處隱蔽的房頂上張望阁猜。 院中可真熱鬧,春花似錦蹋艺、人聲如沸剃袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民效。三九已至,卻和暖如春涛救,著一層夾襖步出監(jiān)牢的瞬間畏邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工检吆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舒萎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蹭沛,卻偏偏與公主長得像臂寝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摊灭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355