// 接口兼容性 interface X { a: any; b: any; } interface Y { a: any; b: any; c: any; } let x: X = { a: 1, b: 2 } let y: Y = { a: 1, b: 2, c: 3 } x = y // Property 'c' is missing in type 'X' but required in type 'Y'. y = x
// 可选参数和剩余参数 let a = (p1: number, p2: number) => { } let b = (p1?: number, p2?: number) => { } let c = (...args: number[]) => { } a = b a = c // 可选参数不兼容固定参数 ,剩余参数 // b = a // b = c c = a c = b
// 3) 返回值类型 let f = () => ({ name: 'Alice' }) let g = () => ({ name: 'Alice', location: 'Beijing' }) f = g // 不能将类型“() => { name: string; }”分配给类型“() => { name: string; location: string; }”。Property 'location' is missing in type '{ name: string; }' but required in type '{ name: string; location: string; }'. // g = f
// 类兼容性 class A { constructor(p: number, q: number) { } id: number = 1 private name: string = '' } class B { static s = 1 constructor(p: number) { } id: number = 2 private name: string = '' } class C extends A { } let aa = new A(1, 2) let bb = new B(1) // 不能将类型“B”分配给类型“A”。类型具有私有属性“name”的单独声明。 aa = bb // 不能将类型“A”分配给类型“B”。类型具有私有属性“name”的单独声明。 bb = aa let cc = new C(1, 2) aa = cc cc = aa
泛型兼容性
泛型接口中,只有泛型变量被接口成员使用才影响泛型的兼容性
1 2 3 4 5 6 7 8
// 泛型接口 interface Empty<T> { value: T } let obj1: Empty<number> = {}; let obj2: Empty<string> = {}; // 不能将类型“Empty<string>”分配给类型“Empty<number>”。不能将类型“string”分配给类型“number”。 obj1 = obj2
上面如果 泛型变量 T 如果没有被成员变量使用则兼容
1 2 3 4 5 6 7
// 泛型接口 interface Empty<T> { // value: T //没有使用泛型变量 T } let obj1: Empty<number> = {}; let obj2: Empty<string> = {}; obj1 = obj2
如果两个泛型函数的定义相同,但是没有指定类型参数,那么它们之间也是可以互相兼容的。
1 2 3 4 5 6 7 8 9
let log1 = <T>(x: T): T => { console.log('x') return x } let log2 = <U>(y: U): U => { console.log('y') return y } log1 = log2
class Java { helloJava() { console.log('Hello Java') } java: any }
class JavaScript { helloJavaScript() { console.log('Hello JavaScript') } js: any }
// 类型保护函数 // lang is Java:类型谓词 functionisJava(lang: Java | JavaScript): langisJava{ return (lang as Java).helloJava !== undefined }
functiongetLanguage(type: Type, x: string | number) { let lang = type === Type.Strong ? new Java() : new JavaScript(); if (isJava(lang)) { lang.helloJava(); } else { lang.helloJavaScript(); }
// if ((lang as Java).helloJava) { // (lang as Java).helloJava(); // } else { // (lang as JavaScript).helloJavaScript(); // }