注意点:
实现一个带有可选属性的接口并不能创建该属性
只要一个接口继承了某个类,那么就会继承这个类中所有的属性和方法,但是只会继承属性和方法的声明,不会继承属性和方法实现
与 extends 的区别:
extends:继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法
implements:继承某个类,必须重写才可以使用
export default {}
interface IPersonInfo{
name:string
age:number
sex?:string
show():void
}
interface IMusic{
music:string
}
class Person implements IPersonInfo,IMusic{
name: string='吴谨言'
age:number=21
// sex:string='女'
music:string='雪落下的声音'
show(){
console.log(`我叫${this.name},是主演延禧攻略的主演,今年${this.age}岁了`);
}
}
let p = new Person()
p.show()
// p.sex='女';//报错
// 注意点:只要一个接口继承了某个类,那么就会继承这个类中所有的属性和方法
// 但是只会继承属性和方法的声明,不会继承属性和方法实现
interface ITest extends Person{
salary:number
}
class Star extends Person implements ITest{
name: string='关晓彤'
age:number=20
salary:number=100000
}
let s = new Star()
console.log(s.name);
console.log(s.salary);
export default {}
const arr1:string[]=['李易峰','陈伟霆','杨幂'];
const arr2:Array<string>=['成毅','杨紫']
const arr3:Array<number>=[12,63,23,48]
// 不使用泛型
let getArray = (value:number,item:number):number[]=>{
return new Array(item).fill(value)
}
let arr = getArray(10,3)
// let arr = getArray('zhang',3);//报错
console.log(arr);
let getArray1 = (value:any,item:number):any[]=>{
return new Array(item).fill(value)
}
console.log(getArray1(10,3));
console.log(getArray1('白鹿',3));
// 使用泛型
let getArray2 = <T>(value:T,item:number):T[]=>{
return new Array(item).fill(value)
}
let res = getArray2<string>('鞠婧祎',2)
let res1 = getArray2<number>(2,2)
console.log(res);
console.log(res1);
export default {}
// 演示可能出现的问题
// function getLength<T>(arr:T):T{
// console.log(arr.length);
// return arr
// }
// 通用方法
function getLength<T>(arr:Array<T>):Array<T>{
console.log(arr.length);
return arr
}
getLength([1,2,3])
getLength(['赵丽颖','迪丽热巴','杨幂'])
// getLength('刘亦菲');//报错
// 泛型接口
interface ILength{
length:number
}
function getLengths<T extends ILength>(arr:T):number{
return arr.length
}
getLengths([1,2,3])
getLengths(['赵丽颖','迪丽热巴','杨幂'])
getLengths('刘亦菲')
export default {}
interface IPerson{
name:string
sex:string
}
let p:IPerson={
name:'李易峰',
sex:'男'
}
interface IPersons<T1,T2>{
name:T1
sex:T2
}
let ps:IPersons<string,number>={
name:'杨幂',
sex:0
}
interface IPersos<T1=string,T2=string>{
name:T1
sex:T2
}
let pi:IPersos={
name:'蔡徐坤',
sex:'男'
}
export default {}
// 泛型类使用<>括起泛型类型,跟在类名后面
class Person<T1,T2>{
name:T1
age:T2
sex:T1
constructor(name:T1,age:T2,sex:T1){
this.name=name
this.age=age
this.sex=sex
}
}
const p1 = new Person('白鹿',18,'女')
const p2 = new Person<string,number>('迪丽热巴',18,'女')
const p3:Person<string,number>=new Person('白鹿',18,'女')
export default {}
//任何类型都可以赋值给unknown类型
let str: unknown
str = '李四'
str = 18
str = true
//不能将unknown类型赋值给其他类型
let val: unknown = 18
let num: unknown
//num=val
//类型断言
num = val as number
//类型缩小
if (typeof val == 'number') {
num = val
}
//unknown与其他任何类型组成交叉类型最后i都是其他类型
type myType1 = number & number
type myType2 = unknown & boolean
let a:myType1=18;
let b:myType2 = false;
//unknown除了与any以外与其他任何类型组成的联合类型最后都是unknown类型
type myType3 = unknown | any
type myType4 = unknown | string
type myType5 = unknown | string | boolean
//never类型都是unknown类型的子类型
type myType6 = never extends unknown?true:false
可以使用for of进行迭代
创建Map:
let myMap = new Map();
Map相关的函数与属性:
export default{}
let nameMap = new Map()
//格式Map对象
nameMap.set("赵四",1)
nameMap.set("张三",1)
nameMap.set("六四",1)
//获取键对应的值
// console.log(nameMap.get("张三"));
//判断Map中是否包含键对应的值
console.log(nameMap.has("赵四"));
console.log(nameMap.has("六三"));
//返回Map对象键/值对的数量
console.log(nameMap.size);
//删除
console.log(nameMap.delete("赵四"));
console.log(nameMap.delete("六三"));
//移除Map对象的所有键/值对
nameMap.clear()
console.log(nameMap);
//迭代Map中的key
for(let key of nameMap.keys()){
console.log(key);
}
//迭代Map中的value
for(let value of nameMap.values()){
console.log(value);
}
//迭代Map中的key +> value
for(let entry of nameMap.entries()){
console.log(entry[0],entry[1]);
}
//使用对象解析
for(let [key,value] of nameMap){
console.log(key,value);
}
export default {}
// 复习三元运算符 x=y?a:b
// let score = 30
// if(score>=60){
// console.log("不及格");
// }else{
// console.log("及格");
// }
// score>=60?"及格":"不及格"
let result=''
result=score>=60?'及格':'不及格'
console.log(result);
// 条件类型
type MyType<T>=T extends string ? string :any;
type res = MyType<string>
interface IName{
name:string
}
interface IAge{
age:number
}
type Condition<T>=T extends string ? IName :IAge;
function reLoad<T extends number | string>(idOrName:T):Condition<T>{
throw "";
}
reLoad(19)
reLoad('zhang')
export default{}
//Record映射类型
//他就将一个类型的所有属性值都映射到另一个类型上并创造一个新的类型
type Name="person"|"animal"
type Person={
name:string
age:number
}
type NewType=Record<Name,Person>
let res:NewType={
person:{
name:"富兰克林",
age:18
},
animal:{
name:"小查",
age:3,
}
}
console.log(res);
//Pick映射类型
//将原来的类型中的vud内容映射到新类型中
interface IPerson{
name:string
age:number
}
type MyType = Pick<IPerson,"name">
let res2:MyType={
name:"催付"
}
console.log(res2);