泛型
泛型可以理解为宽泛的类型,通常用于类和函数。使用的时候我们再指定类型 泛型不仅可以让我们的代码变得更加健壮,还能让我们的代码在变得健壮的同时保持灵活性和可重用性。
通过用<T>来表示,放在参数的前面
泛型约束
// 创建一个接口
interface f{
length:number
}
// 本身没有length 所以要创建一个具有length属性的接口继承一下
function fn<T extends f>(arr:T):number{
return arr.length
}
console.log(fn("的撒"));
泛型接口
// 泛型接口
// interface j<T1,T2>{
// name:T1;
// sex:T2
// }
// let p:j<string,string>={
// name:"杨杜坤",
// sex:"难"
// }
// 指定默认值
interface j<T1=string,T2=number>{
name:T1;
sex:T2
}
let p:j={
name:"杨杜坤",
sex:10
}
泛型类
// 泛型类的使用
// 创建一个类
class fn<T1,T2> {
name:T1;
sex:T1;
age:T2;
constructor(name:T1,sex:T1,age:T2) {
this.name=name;
this.sex=sex;
this.age=age;
}
}
let p = new fn<string,number>("杨杜坤","男",17)
console.log(p);
其他补充类型
unknown类型
unknown类型代表任何值。这与any类型类似,但更安全,因为对未知unknown值做任何事情都是不合法的。
unknown类型被称作安全的any
1、任何类型都可以赋值给unknown类型2、不能将unknown类型赋值给其他类型3、unknown与其他任何类型组成的交叉类型最后都是其他类型4、unknown除了与any以外,与其他任何类型组成的联合类型最后都是unknown类型5、never类型是unknown类型的子类型
// unknown类型
// 1、可以赋值任何类型
let a_1:unknown = 19;
let a_2:unknown = "哈哈哈";
// // 2、不能将unknown类型赋值给其他类型
let a_3:number=10;
// a_3=a_1; 报错
// // 可以通过类型断言赋值
a_1 =a_3 as number;
// // 可以通过类型缩小
if(typeof a_1 =="number"){
a_3 = a_1
}
// // 3、unknown与其他任何类型组成的交叉类型最后都是其他类型
let a_4:unknown&number =19;
// //4、unknown除了与any以为ia,与其他任何类型组成的联合类型最后都是unknown类型
let a_5:unknown|any = "哈哈哈"; //any
let a_6:unknown|number = 19; //unknown
// // 5、never类型是unknown类型的子类型
type a_7 = never extends unknown ?true:false;
map类型
Map对象保存键值对。并且能够记住键的原始插入顺序。 任何值(对象或者原始值)都可以作为一个键或—个值。 Map集ES6中引入的一种新的数据结构 可以使用for of进行迭代 创建map: let myMap = new Map (); Map相关的函数与属性: map.clear()-移除Map对象的所有键/值对。
map.set()-设置键值对,返回该Map对象。 map.get()-返回键对应的值,如果不存在,则返回undefined. map.has()-返回一个布尔值,用于判断 Map中是否包含键对应的值。 map.delete() -删除 Map 中的元素,删除成功返回true,失败返回false
map.size -返回Map对象健/值对的数量。 map.keys() -返回一个 lterator对象,包含了Map对象中每个元素的健。
map.values()-返回一个新的lterator对象, 包含了Map对象中每个元素的值。
// Map类型
// 创建一个Map对象
let set = new Map();
// // 往Map中添加内容
set.set("杨杜坤",1)
set.set("杨杜",2)
set.set("杨坤",3)
map.get()-返回键对应的值,如果不存在,则返回undefined.
console.log(set.get("杨杜坤"));
// map.has()-返回一个布尔值,用于判断 Map中是否包含键对应的值。
console.log(set.has("杨杜坤"));
console.log(set.has("杨"));
// map.size -返回Map对象健/值对的数量。
console.log(set.size);
/map.delete() -删除 Map 中的元素,删除成功返回true,失败返回false
console.log(set.delete("杨杜坤"));
console.log(set.delete("杨"));
// map.clear()-移除Map对象的所有键/值对。
set.clear()
console.log(set);
// 迭代Map中的key
for(let key of set.keys()){
console.log(key);
}
// // 迭代Map中的value
for(let value of set.values()){
console.log(value);
}
// // 迭代Map中的key=>value
for(let a of set.entries()){
console.log(a);
}
// // 使用对象解析
for(let [key,value] of set){
console.log(key,value);
}
条件类型
export default{}
// 通过泛型判断类型
interface str{
str:string
}
interface num{
num:number
}
type fx<T>=T extends string ? str:num;
function fn<T extends number | string >(idOrName:T):fx<T>{
throw ""
// console.log(idOrName);
}
let res1 = fn("杨杜坤");
let res2 = fn(19);
// console.log(res1,res2);