掌握 TS 的高级类型及用法
1-any 类型
定义及作用
any: 任何类型的值都可以赋值给 any , any 也可以赋值给任意类型。
let a:number
let b:string = 'hello'
a = b
它能逃过TypeScript编译器的类型检测,并和TypeScript中其他所有类型都相互兼容, 但是会造成类型污染,而且使用不存在的属性或方法时不报错
any的使用场景
- 不挑任何类型的函数。 例如,
console.log(); 定义一个函数,输入任意类型的数据,返回该数据类型 - 临时使用 any 来“避免”书写很长、很复杂的类型
隐式 any
- 声明变量不提供类型也不提供默认值
- 定义函数时,参数不给类型
原则:能不用 any 就不用
02-类型断言
类型断言的作用和使用用场景
作用: 类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型
为何使用 : 类型断言用于解决 “不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型中共有的属性或方法”
场景:有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型。
语法格式
关键字: as
<类型>值 或 值 as 类型
解释:
- 使用
as关键字实现类型断言 - 关键字 as 后面的类型是一个更加具体的类型(HTMLAnchorElement 是 HTMLElement 的子类型)
示例
var str = '1'
var str2:number = <number> <any> str //str、str2 是 string 类型
console.log(str2)
泛型-基本介绍
泛型,是指在定义函数,接口,类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
本质是参数化类型,通俗的讲,就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和函数的创建中,分别成为泛型类,泛型接口、泛型函数
泛型-泛型函数
定义格式
function 函数名<类型变量1,类型变量2,...>(参数1:类型1,参数2:类型2,...): 返回值类型 {
}
在函数名称的后面写 <>,尖括号中添加类型变量
示例
function fn<T>(value: T): T { return value } //T可以是任意合法的变量名称
调用格式
const 返回值 = 泛型函数名<类型1,类型2,...>(实参1,实参2,实参3,......)
语法:在函数名称的后面添加 <>,尖括号中指定具体的类型
示例
const num = fn<number>(10)
const str = fn<string>('a')
泛型接口
目标
在接口中使用泛型来使用,以增加其灵活性,增强其复用性
interface MyArray {
length: number,
push(n: number):void,
pop():number,
reverse():number[]
}
let obj: MyArray = {
id(value) { return value },
ids() { return [1, 3, 5] }
}
定义
interface 接口名<类型变量1,类型变量2...> {
属性名1:类型1,
属性名2:类型2,
属性名3:类型3
}
- 在接口名称的后面添加
<类型变量>,那么,这个接口就变成了泛型接口。 - 接口的类型变量,对接口中所有其他成员可见,也就是接口中所有成员都可以使用类型变量。
- 使用泛型接口时,需要显式指定具体的类型