1. 函数使用泛型(Generics):
(1). 怎么将传入值和传出值规定好的类型?
function test(a: any): any {
return a;
}
const a: string = test(123) // 成立,因为是any
(2). 使用泛型:
①. 在定义函数和接口或类的时,故意不指定类型,而是使用的时候,再指定类型.可以看做为一个占位符.
②. function test<T>(a: T): T { // 函数参数、返回值使用泛型
return a;
}
const str: string = 'str'
const result = test(str) // 上面定义了参数是string,则这里返回的result也是string
③. function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[Ø]]
}
const a = swap('a', 1); // a的类型为[string, number]
(3). 约束:
①. function test<T>(a: T): T {
// 报错,事先不知道是哪种类型,会提示a不一定会有length属性,理论上是作用在函数T类型的array,这样就可以使用length了
console.log(a.length)
}
②. 改进:
function test<T>(a: T[]): T[] {
console.log(a.length)
return a
}
const arrs = test([1, 2, 3])
③. 约束:
a. 这里就只能传数组,对象和普通类型就不能传输.
b. 可以对泛型进行约束,只允许传入包含length属性的变量.
interface ITestLength {
length: number
}
function test<T extends ITestLength>(a: T): T { // extends让传入值满足特定的给束条件
console.log(a.length)
return a
}
const a = test('str')
const obj = test({ length: 10}) // 只要有length属性就行
const arr = test([1, 2, 3])
3. 接口使用泛型:
interface KeyPair<T, U> {
key: T,
value: U
}
let kp1: KeyPair<number, string> = { key: 123, value: 'str' }
let kp2: KeyPair<string, number> = { key: 'str', value: 123 }
4. 数组使用泛型:
let arr: number[] = [1, 2, 3]; // 定义数组类型
let arr: Array<number> = [1, 2, 3]; // 使用泛型定义,这个Array就是interface