1、接口
接口类型是一种自定义类型,可以让我们自定义出一种数据类型的格式,之后在声明这种类型时值的格式都必须按照接口说描述好的来定义。
声明一个接口是首字母应该大写。
另外接口内部以分号分隔。
下面这个 MyInt 接口就是给对象用的,用来让对象统一类型和格式
interface MyInt {
name:string;
age:number;
gender:number
}
let obj1:MyInt = { name:"zhangsan" , age:18 , gender:1 }
// let obj2:MyInt = { work:"" , name:"zhangsan" , age:18 , gender:1 } // 报错 因为该类型没有work字段
// let obj3:MyInt = { name:"zhangsan" , age:18 , gender:"1" } // 报错 因为gender字段在接口中是number类型
数组接口类型,该类型规定数组的每一项都是number和string类型,否则报错。
这里 [id:number] 代表的是下标的类型 后面代表的是值类型
interface MyArr {
// 这种形式同时还能代表键值对 ( name:"zhangsan" ),因此可以用来当作对象的格式也可以
[id:number]:number|string
}
let arr1:MyArr = [ '1' , '2' , 3 , 4 , 5 ]
函数接口类型 规定函数的类型格式。
(p:string|number) 代表函数传入的参数的类型,
void 代表返回值的类型为空,可以不返回值
interface MyFoo {
(p:string|number) : void
}
let foo1:MyFoo = ()=>{
}
// foo1(true) // 报错 因为规定了参数的类型必须为string和number
foo1(11);
foo1("aa");
接口的合并 继承 以及只读 和缺省。
用 readonly 声明的字段代表该字段是只读,不可在改。
属性名? 这种方式声明的字段代表该字段不是必须的字段,可以不写。
interface Ainter {
readonly name:string;
}
interface Binter {
age?:number;
gender:string;
}
// extends 代表继承 继承了其他接口后,在使用时就必须将所继承接口的格式也全部定义好
interface Cinter extends Ainter , Binter {
height:number;
}
let obj2:Cinter = {
name:"zs",
height:1.80,
gender:"nan"
};
// obj2.name = "lisi" //报错 只读属性不可修改
当两个接口同名时,它们就会自动合并在一起,因此在使用必须都写上。
interface ABinter {
name:string
}
interface ABinter {
age:number
}
let obj3:ABinter = { name:"zs" , age:18 }
// let obj4:ABinter = { name:"zs" }; //报错 因为没有age
2、类型别名
用type关键字可以声明类型别名,这个类型别名和接口其实有点类似,都是可以用来自定义一个类型。
type StrOrNum = number|string;
let aa:StrOrNum = 'aaa';
aa = 123
用类型别名来声明一个函数的类型格式
type Fn = (p:string) => void
let foo1:Fn = (p)=>{ };
foo1("aa")
类型别名可以和接口混合在一起使用。
interface Ainter {
gender:number;
}
type num = Ainter['gender'];
let bb:num = 123;
Ainter['gender'] 代表 取 Ainter接口中的 gender 的类型
promise的用法
interface Arrintf {
// 这种形式同时还能代表键值对 ( name:"zhangsan" ),因此可以用来当作对象的格式也可以
[key:string]:number|string
}
interface PromIntf {
code:number;
msg:string,
data:Arrintf[]
}
let pro:Promise< PromIntf > = new Promise((resolve , reject)=>{
resolve({
code:200,
msg:"66666",
data:[ { name:"zs" } , { name:"lisi" } ]
})
})
pro.then(res=>{
console.log(res.code , res.msg)
})