当使用子类声明一个类时,它可以作用于类本身,也可以作用于类的成员函数。
下面是一个具有相同类型元素的栈结构的简单实现,如下所示:
class Stack {
private arr: T[] = []
public push(item: T) {
this.arr.push(item)
}
public pop() {
this.arr.pop()
}
}
如何使用它:
const stack = new Stacn<number>()
如果上面只能传递字符串和数字类型,那么可以使用猜测“约束类库”的方法,如下所示:
除了上述方法之外,泛型更多的中间用途如下:
例如,我们要设计一个函数,它接受两个参数,一个参数是对象,另一个参数是对象上的属性。 我们通过这两个参数返回该属性的值。
此时基类的索引类型和约束类型被设计为联合实现。
索引类型、约束类型
索引类型keyof T取出传入对象的属性类型,生成联合类型。 这里的子类U被约束为这个联合类型,如下所示:
function getValue<T extends object, U extends keyof T>(obj: T, key: U) {
return obj[key] // ok
}
上面之所以需要使用类库约束而不是直接将第一个参数定义为对象类型是因为默认情况下object指的是{},而我们接收到的对象是多种多样的。 类库代表传入的Object类型typescript 函数泛型typescript 函数泛型,如T extends object
使用如下图:
多种类型约束
例如,需要实现两个套接字的类型约束,如下所示:
interface FirstInterface {
doSomething(): number
}
interface SecondInterface {
doSomethingElse(): string
}
可以创建一个socket来继承上面两个socket,如下:
interface ChildInterface extends FirstInterface, SecondInterface {
}
正确的使用方法如下:
class Demo<T extends ChildInterface> {
private genericProperty: T
constructor(genericProperty: T) {
this.genericProperty = genericProperty
}
useT() {
this.genericProperty.doSomething()
this.genericProperty.doSomethingElse()
}
}
通过形式参数约束可以达到多类型约束的目的。
3、应用场景
通过上面的初步了解,后面会提到,在编译TypeScript的时候,定义函数、接口或者类的时候,并不是提前定义具体的类型,而是在使用的时候,指定该类型的一个特性。 ,在这种情况下你可以使用类库
灵活使用类库定义类型是掌握TypeScript的必由之路
参考
- 结束 -
系列更新中:7/12