16 | 类型检查机制(2):类型兼容性

advanced1.ts

类型兼容性:

当一个类型Y可以被赋值给另一个类型X时,我们就可以说类型X兼容类型Y

X兼容Y:X(目标类型) = Y(源类型)

口诀:

结构之间兼容:成员少的兼容成员多的

函数之间兼容:参数多的兼容参数少的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* 
* X 兼容 Y: X(目标类型) = Y(源类型)
*/

let s: string = 'a'
s = null;

// 接口兼容性
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;
// 函数兼容性
type Handler = (a: number, b: number) => void
function hof(Handler: Handler) {
return Handler
}

//1)参数个数
let handler1 = (a: number) => {}
hof(handler1)
let handler2 = (a: number, b: number, c:number) => {}
// hof(handler2)

// 可选参数和生育参数
let a = (p1: number, p2: number) => {}
let b= (p1?: number, p2?: number) => {}
let c = (...args: number[]) => {}
a = b
a = c
b = c
b = a
c = a
c = b

//2)参数类型
let handler3 = (a: string) => {}
// hof(handler3)

interface Point3D {
x: number;
y: number;
z: number;
}
interface Point2D {
x: number;
y: number;
}
let p3d = (point: Point3D) => {};
let p2d = (point: Point2D) => {};
p3d = p2d
p2d = p3d

//3)返回值类型
let f = () => ({name: 'Alice'});
let g = () => ({name: 'Alice', location: 'Beijing'});
f = g
// g = f

function overload(a: number, b: number): number;
function overload(a: string, b: string): string;
function overload(a: any, b: any): any {}

// 枚举兼容性
enum Fruit { Apple, Banana }
enum Color { Red, Yellow }
let fruit: Fruit.Apple = 3
let no: number = Fruit.Apple
let color: Color.Red = Fruit.Apple

// 类兼容性
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 = ''
}
let aa = new A(1, 2);
let bb = new B(1)
// aa = bb
// bb = aa
class C extends A {}
let cc = new C(1, 2)
aa = cc
cc = aa

// 泛型兼容性
interface Empty<T> {
value: T
}
// let obj1: Empty<number> = {};
// let obj2: Empty<string> = {};
// obj1 = obj2

let log1 = <T>(x: T): T => {
console.log('x')
return x
}
let log2 = <U>(y: U): U => {
console.log('y')
return y
}
log1 = log2
要是这篇文章帮到了您,期待您请我喝一杯咖啡。