# 类型推断和兼容性
WARNING
- 类型推断
- 基础
- 多类型联合
- 上下文类型
- 类型兼容性
- 基础
- 函数兼容性
- 参数个数
- 参数类型
- 返回值类型
- 可选参数和剩余参数
- 参数双向协变
- 函数重载
- 枚举
- 类
- 泛型
在有时候可以省略类型的指定,TS会自动推断出对应的类型。
// 会自动推断出是字符串类型
let name = 'xiaoyu'
// let name: string
1
2
3
2
3
多类型联合
let arr4 = [1, 'a']
// let arr4: (string | number)[]
1
2
2
上下文类型,根据等号左边推断等号右边的类型
// 此处会推断出 mouseEvent:MouseEvent
window.onmousedown = function (mouseEvent) {
console.log(mouseEvent, 'mouseEvent')
}
1
2
3
4
2
3
4
类型兼容性
interface Info3 {
name: string
}
let infos3: Info3
let info31 = { name: 'xiaoyu' }
let info32 = { age : 18 }
let info33 = { name: '小于', age: 19 }
infos3 = info31
infos3 = info32 // 提示没有name属性
infos3 = info33
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
函数的兼容性
- 参数个数
let x = (a: number) => 0
let y = (a: number, c: number) => 0
y = x
x = y // 提示错误,右边的必须要小于等于左边的参数才可以
1
2
3
4
5
6
2
3
4
5
6
- 参数类型
let x = (a: number) => 0
let y = (b: string) => 0
// x = y // 提示不匹配
1
2
3
4
5
2
3
4
5
- 可选参数和剩余参数
let getSum = (arr: number[], callback:(...args: number[]) => number): number => {
return callback(...arr)
}
let res = getSum([1, 2, 3], (...args: number[]) : number => args.reduce((a, b) => a + b, 0))
console.log(res, '求和')
// 函数传参一个个的传也是可以的
let res2 = getSum([1, 2, 3], (arg1: number, arg2: number, arg3: number): number => arg1 + arg2 + arg3)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
返回值类型
let x1 = () : string | number => 0
let y1 = () : string => 'a'
1
2
2
# 函数重载
function merge(arg1: number, arg2: number) : number
function merge(arg1: string, arg2: string) : string
function merge(arg1: any, arg2: any) {
return arg1 + arg2
}
1
2
3
4
5
2
3
4
5
枚举
enum StatusEnum {
On,
Off
}
enum AnimalEnum {
Dog,
Cat
}
let s = StatusEnum.On
s = AnimalEnum.Dog // 不兼容
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
类的兼容性,当使用类作为类型来使用的时候其实是检测的是实例
class AnimalClass {
static age: number
constructor(name: string) {
}
}
class PeopleClass {
static age: string
constructor(name: string) {
}
}
class FoodIsClass {
constructor(name: number) {
}
}
let animal: AnimalClass
let people: PeopleClass
let food: FoodIsClass
animal = people // 不会检测类的静态成员,只会检测实例的
animal = food // 实例属性不一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
泛型的兼容性
interface Data<T> {}
let data1: Data<number>
let data2: Data<string>
data1 = data2 // 此时赋值是可以的
1
2
3
4
5
2
3
4
5
interface Data<T> {
data: T
}
let data1: Data<number>
let data2: Data<string>
data1 = data2 // 此时不可以
1
2
3
4
5
6
2
3
4
5
6