// 定义一个泛型接口 interface baseinfo<T> { data:T[] add:(t: T) => T } // 定义一个用户信息的类 class Person { id?:number name:string age:number constructor(name:string,age:number){ this.name = name this.age = age } } // 定一个类,针对用户信息对象进行增加查询的操作 class Listperson implements baseinfo<Person> { data: Array<Person> = [] // 函数返回值的类型不是any或void,必须有返回值,return add(person:Person):Person{ person = {...person,id:Date.now()+ Math.random()} this.data.push(person) return person } getperson(id:number):Person{ return this.data.find(item => item.id === id) } } const listperson = new Listperson() listperson.add(new Person('lisa',123)) const { id } = listperson.add(new Person('zahng',12)) console.log(listperson.data); console.log(id,listperson.getperson(id)); })()
泛型类
在定义类时, 为类中的属性或方法定义泛型类型 在创建类的实例时, 再指定特定的泛型类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
(() => { class GenericNumber<T> { zeroValue: T add: (x: T, y: T) => T } let myGenericNumber = new GenericNumber<number>() myGenericNumber.zeroValue = 0 myGenericNumber.add = function (x, y) { return x + y } let myGenericString = new GenericNumber<string>() myGenericString.zeroValue = 'abc' myGenericString.add = function (x, y) { return x + y } console.log(myGenericString.add(myGenericString.zeroValue, 'test')) console.log(myGenericNumber.add(myGenericNumber.zeroValue, 12)) })()
泛型约束
如果我们直接对一个泛型参数取 length 属性, 会报错, 因为这个泛型根本就不知道它有这个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
(() => { // 没有泛型约束 function fn<T>(x: T): void { // console.log(x.length) // error } function fn2(x: number[]): void { console.log(x.length) } interface Lengthwise { length: number }
/* 1. ECMAScript 的内置对象 */ let b: Boolean = new Boolean(1) let n: Number = new Number(true) let s: String = new String('abc') let d: Date = new Date() let r: RegExp = /^1/ let e: Error = new Error('error message') // 以上都是对象 b = true // let bb: boolean = new Boolean(2) // error