类型兼容性
函數
1.函數參數個數??
左邊的個數大于右邊
如果對函數 y 進行賦值,那么要求 x 中的每個參數都應在 y 中有對應,也就是 x 的參數個數小于等于 y 的參數個數
let x = (a: number) => 0; let y = (b: number, c: string) => 0;2.函數參數類型
let x = (a: number) => 0; let y = (b: string) => 0; let z = (c: string) => false; x = y; // error 不能將類型“(b: string) => number”分配給類型“(a: number) => number”。 x = z; // error 不能將類型“(c: string) => boolean”分配給類型“(a: number) => number”。3.剩余參數和可選參數
const getNum = (arr: number[],callback: (arg1: number, arg2?: number) => number // 這里指定第二個參數callback是一個函數,函數的第二個參數為可選參數 ): number => {return callback(...arr); // error 應有 1-2 個參數,但獲得的數量大于等于 0 };4.函數參數雙向協變
函數參數雙向協變即參數類型無需絕對相同
他們的聯合類型相同即可
5.函數返回值類型
函數返回值應該是同種類型,不同就會報錯的
6.函數重載
function merge(arg1: number, arg2: number): number; // 這是merge函數重載的一部分 function merge(arg1: string, arg2: string): string; // 這也是merge函數重載的一部分 function merge(arg1: any, arg2: any) { // 這是merge函數實體return arg1 + arg2; } function sum(arg1: number, arg2: number): number; // 這是sum函數重載的一部分 function sum(arg1: any, arg2: any): any { // 這是sum函數實體return arg1 + arg2; } let func = merge; func = sum; // error 不能將類型“(arg1: number, arg2: number) => number”分配給類型“{ (arg1: number, arg2: number): number; (arg1: string, arg2: string): string; }”上面例子中,sum函數的重載缺少參數都為string返回值為string的情況,與merge函數不兼容,所以賦值時會報錯。
?
類
1.比較兩個類類型的值的兼容性時,只比較實例的成員,類的靜態成員和構造函數不進行比較
?類類型比較兼容性時,只比較實例的成員
class Animal {//成員static age: number; constructor(public name: string) {} } class People {
//成員 static age: string; constructor(public name: string) {} }
2.類的私有成員和受保護成員
類的私有成員和受保護成員會影響兼容性。當檢查類的實例兼容性時,如果目標(也就是要被賦值的那個值)類型(這里實例類型就是創建它的類)包含一個私有成員,那么源(也就是用來賦值的值)類型必須包含來自同一個類的這個私有成員,這就允許子類賦值給父類。
?
泛型
泛型包含類型參數,這個類型參數可能是任意類型,使用時類型參數會被指定為特定的類型,而這個類型只影響使用了類型參數的部分。來看例子:
interface Data<T> {} let data1: Data<number>; let data2: Data<string>; data1 = data2;在這個例子中,data1 和 data2 都是 Data 接口的實現,但是指定的泛型參數的類型不同,TS 是結構性類型系統,所以上面將 data2 賦值給 data1 是兼容的,因為 data2 指定了類型參數為 string 類型,但是接口里沒有用到參數 T,所以傳入 string 類型還是傳入 number 類型并沒有影響
?
轉載于:https://www.cnblogs.com/guangzhou11/p/11316158.html
總結
- 上一篇: 类型推论
- 下一篇: Linux下C语言编程-进程的创建