TypeScript中的类型别名与泛型限制
最编程
2024-07-27 21:08:41
...
什么是ts泛型约束?我们先来看下面一个例子
有时候我们会有这样的泛型使用
function getLength<T> (arg: T) {
console.log(arg.length)
return arg
}
getLength<string>('22')
我们期望在一个泛型的变量上面,获取其length
参数,但是,有的数据类型是没有length
属性的,比如布尔值。所有你的编辑器就会报下面的错
类型“T”上不存在属性“length”。
于是,我们就得对使用的泛型进行约束,我们约束其为具有length
属性的类型,这里我们会用到interface
,代码如下
interface Ilength {
length: number
}
function getLength<T extends Ilength> (arg: T) {
console.log(arg.length)
return arg
}
getLength<string>('22')
这样,我们的代码就不会报出警告了,同时,在使用的时候,也会做出相应的约束,比如,我们通过下面这样去调用,就会有这样的提示
keyof
同样的,我们有时候会访问一些自定义的属性,就像下面的代码
function getProprty<T, K> (obj: T, key: K) {
return obj[key]
}
const people = { name: 'xiaozhanng', age: 16 }
getProprty(people, 'name')
我们代码的意图是,通过传入一个泛型的对象,或者什么其他的变量,然后再传入另外一个泛型的变量,找到obj下面的key属性。
这个时候就你的编辑器就会报这样的错
类型“K”无法用于索引类型“T”。
意思是,我们传入的泛型key变量,不一定是存在于泛型obj中的属性。这样就会让代码不够严谨,为解决这一问题,我们可以使用keyof
,他可以拿到一个类型下所有的属性,就像这样
同样的,我们可以将其用在自定义的对象上
let keys: keyof typeof people
按照这个思路,我们就可以利用泛型约束,对上面的代码做修改
function getProprty<T, K extends keyof T> (obj: T, key: K) {
return obj[key]
}
const people = { name: 'xiaozhanng', age: 16 }
getProprty(people, 'name')
// keyof 获取对象的所有属性
let keys: keyof typeof people
上面代码中,我们约束K泛型变量为T变量中的某一个属性。这样,在调用的时候就可以做约束了,比如我下面的调用就会出错
这就是泛型约束,很常用哦!
推荐阅读
-
父母类型解析:驱动型与情绪型在家庭教育中的影响
-
轻松理解 TypeScript 中的泛型 T 与 any 类型的不同之处
-
玩转现代TypeScript的高阶指南:深入理解泛型与类型操作艺术
-
理解 TypeScript 中的泛型概念
-
彻底明白了 TypeScript 中的泛型啊!
-
简单易懂地理解 TypeScript 中的泛型
-
如何在实践中综合运用TypeScript:创建一个能适用于MySQL、MongoDB和 MSSQL的底层类库,通过类型、接口、类及泛型实现统一操作
-
TypeScript实战笔记:详解类与泛型的运用实例,学习如何在TypeScript中玩转泛型,及其在提升代码灵活性与安全性的角色 - 青训营教程
-
玩转 TypeScript:深入理解与实际运用中的泛型机制
-
彻底理解 TypeScript 中的泛型 T - 基础用法详析第三部分