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
阅读全文 »

advanced.ts

类型检查机制:

TypeScript编译器在做检查时,所秉承的一些原则,以及表现出的一些行为。

作用:辅助开发提高开发效率。

  • 类型推断
  • 类型兼容性
  • 类型保护

类型推断:

不需要指定变量的类型(函数的返回值类型),TypeScript可以根据某些规则自动的为其推断出一个类型。

  • 基础类型推断
  • 最佳通用类型推断
  • 上下文类型推断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let a = 1;
let b = [1, null];

let c = (x = 1) => x + 1;

window.onkeydown = (event) => {
// console.log(event.button);
}

interface Foo {
bar: number
}
// let foo = {} as Foo;
let foo: Foo = {
bar: 1
}
// foo.bar = 1;
阅读全文 »

advanced2.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum Type { Strong, Week}

class Java {
helloJava() {
console.log('Hello Java')
}
}

class JavaScript {
helloJavaScript() {
console.log('Hello JavaScript')
}
}

function getLanguage(type: Type) {
let lang = type === Type.Strong ? new Java() : new JavaScript()
if (lang.helloJava){
lang.helloJava()
}
return lang
}

getLanguage(Type.Strong)
阅读全文 »

generics1.ts

泛型的好处:

  1. 函数和类可以轻松地支持多种类型,增强程序的扩展性
  2. 不必写多条函数重载
  3. 灵活控制类型之间的约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Log1<T> {
run(value: T) {
console.log(value);
return value;
}
}
let log1 = new Log1<number>()
log1.run(1)
let log2 = new Log1()
log2.run('1')


interface Length {
length: number
}
function log3<T extends Length>(value: T): T {
console.log(value, value.length);
return value;
}
log3([1])
log3('123')
log3({length: 1})
阅读全文 »

generics.ts

  • 泛型:不预先确定的数据类型,具体的类型在使用的时候才能确定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function log<T>(value: T): T {
console.log(value);
return value;
}

log<string[]>(['a','b']);
log(['a','b'])

// type Log = <T>(value: T) => T
// let myLog: Log = log;

interface Log<T = string> {
(value: T): T
}
let myLog: Log = log
myLog('1');
阅读全文 »

class-interface.ts

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
interface Human {
// new (name: string): void;
name: string;
eat(): void;
}

class Asian implements Human {
constructor(name:string){
this.name = name;
}
name: string;
eat(){};
sleep(){}
}

interface Man extends Human{
run(): void;
}

interface Child {
cry():void;
}

interface Boy extends Man, Child{}

let boy: Boy = {
name: '',
run(){},
eat(){},
cry(){}
}

class Auto {
state = 1
// private state2 = 0
}
interface AutoInterface extends Auto{

}
class C implements AutoInterface{
state = 1
}

class Bus extends Auto implements AutoInterface{

}
  • 下图为class与interface的关系图

class与interface的关系图

阅读全文 »