泛型高级用法之extends
通过泛型,我们可以很轻松约束用户所传入的数据类型,但是如果在不限制用户传入类型的情况下,特定的类型是有自己的独特的方法的,比如如下的代码。
function loggingIdentity<T>(arg: T): T {
console.log(arg.length)
return arg
}
这时,上述代码是会报错的,因为arg
的类型是不确定的,所以不一定会有length
属性,那么如何来解决这个问题呢?
使用extends
关键字,通过该关键字来约束数据的类型属性。
这里要定义一个接口
interface LengthWise {
length: number
}
function loggingIdentity<T extends LengthWise>(arg: T): T {
console.log(arg.length)
return arg
}
这样就保证arg
变量肯定会有length
属性了,但与此同时也限制了arg
的传入类型范围,比如,你传入数字就是不可以的。
还可以再延伸一些,通过extends
还可以约束实例对象,例如工厂方法。
class BeeKeeper {
hasMask: boolean;
}
class ZooKeeper {
nametag: string;
}
class Animal {
numLegs: number;
}
class Bee extends Animal {
keeper: BeeKeeper;
}
class Lion extends Animal {
keeper: ZooKeeper;
}
function createInstance<A extends Animal>(c: new () => A): A {
return new c();
}
createInstance(Lion).keeper.nametag; // typechecks!
createInstance(Bee).keeper.hasMask; // typechecks!
本文参考自typescript中文网站:https://www.tslang.cn/docs/handbook/generics.html
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1549