let test: {}; test = 1; test = null; test = false;
function printer (param: string | number) { console.log(param) }
class Dog { eat () {} guardHome () {} } class Cat { eat () {} catchMice () {} } function animalFactory (): Dog | Cat { if (Math.random() * 10 > 5) { return new Dog(); } else { return new Cat(); } } let ani = animalFactory(); ani.guardHome(); // error ani.eat()
根據上面的結論, animalFactory 的返回值應該是Dog類或Cat類的實例均可以,可是卻恰恰只有eat方法能調用成功,屬於各自單獨類的guardHome或 catchMice方法都不能調用成功。javascript
let str; let val: number = (str as string).length; let val2: number = (<string>str).length;
let str; function checkString (str: any): str is string { return str; }
function checkString (param: number | string) { if (typeof param === 'string') { let temp = param; //ok 此處param爲string param += '1'; //ok 此處param爲 string | number param += '1'; //ok 此處param爲 string | number param += 1; // ok 此處string類型能夠與數字相加 return param; // 此處param爲number } else { // 此處此處至關於 if (typeof param === 'number') param += 1; // ok 此處param爲 string | number param += '1'; // error number類型不能與字符串相加 return param // 此處param爲number } }
interface testInter { name: string, age: number } let testArr: string[] = ['tate', 'pomelott']; let testObj: testInter = {name: 'tate', age: 26}
先來驗證數組:前端
function showKey<K extends keyof T, T> (key: K, obj: Array<string>) { return key; } showKey<number, Array<string>>(1, testArr);
再來驗證對象:java
function showKey<K extends keyof T, T> (keyItem: K, obj: T): K { return keyItem; } let val = showKey('name', testObj)
此處有個須要特別注意的點:使用泛型如何表示某個特定key組成的數組:chrome
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] { return items.map(item => obj[item]) }
上例中的 T[K][] 意爲K類型的數組,並且須要知足,K爲T的keytypescript
真正理解了上面這句話,天然就會明白下面四種寫法實際上是等價的:數組
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: T): Array<T[K]> { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): K[] { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): Array<K> { return items.map(item => obj[item]) } let obj = showKey(['name'], testObj)
關於TS泛型和高級類型的新發現,持續更新中。。。瀏覽器