接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽 象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法
接口也是一种数据类型
格式:
interface interface_nane {}
:void
(不返回值)
interface IFullName{
firstName:string,
lastName:string
}
let goddassName:IFullName={
firstName:"杨",
lastName:"超越"
}
console.log(goddassName.firstName);
console.log(goddassName.lastName);
function say({firstName,lastName}:IFullName):void{
console.log(`精灵古怪:${firstName}${lastName}`);
}
say(goddassName)
可选属性使用: ?
只读属性使用: readonly
readonly
与const
的区别:做为变量使用的话用const
,若做为属性则使用readonly
// 可选属性 使用?来进行修饰
interface IFullName{
firstName:string,
lastName:string,
age?:number
}
let goddassName:IFullName={
firstName:"杨",
lastName:"超越"
}
console.log(goddassName.firstName);
console.log(goddassName.lastName);
// 只读属性 readonly
interface IInfo{
readonly uanme:string;
readonly uage:number;
}
let beauty:IInfo={
uanme:"汉库克",
uage:18
}
总结:readyonly
与const
区别:
最简单判断该用readonly
还是const
的方法是看要把它做为变量使用还是做为一个属性。做为变量使用的话用const
。若做为属性则使用readonly
定义:索引签名用于描述那些“通过索引得到”的类型
格式:如 [props: string] :any
应用场景:解决参数问题
interface IFullName{
firstName:string
lastName:string
age?:number
singName?:string
[props:string]:any
}
注意点:如果使用接口来限定了变量或者形参,那么在给变量或者形参赋值的时候,多一个或者少一个都不行实际开发中往往会出现多或者少的情况,怎么解决?
// 少一个或者多多个属性
// 解决方案:可选属性
let goddass1:IFullName ={firstName:"欧阳",lastName:"娜娜"};
let goddass2:IFullName ={firstName:"欧阳",lastName:"娜娜",age:22};
// 多一个或者多多个属性
// 方案一:使用变量
let info = {firstName:"欧阳",lastName:"娜娜",age:22,singName:"美女",dance:"跳舞"}
let doddass3:IFullName = info
// 方案二:适用类型断言
let goddass4:IFullName = ({firstName:"古力",lastName:"娜扎",age:18,singName:"美女",dance:"跳舞"})as IFullName
// 索引签名?
// 索引签名用于描述那些“通过索引得到”的类型
// 注意点:对象中的键,会被转化为字符串
interface Ibeauty{
[props:string]:string;
}
let name:Ibeauty = {name:"迪丽热巴",name2:"古力娜扎",name3:"欧阳娜娜"};
interface Iage{
[props:string]:number
}
let afe:Iage = {age1:18,age2:20,age3:20};
// 方案三:索引签名
let goddass5:IFullName = {firstName:"杨紫",lastName:"杨幂",age:20,singName:"女明星",dance:"演员"}
为了使用接口表示函数类型,我们需要给接口定义一个调用签名。
它就像是一个只有参数列表和返回值类型的函数定义
interface ImakeMoney{
(salary:number,reward:number):number
}
let sum:ImakeMoney=function(x:number,y:number):number{
return x+y;
}
let res = sum(10,20)
console.log(res);
接口继承就是说接口可以通过其他接口来扩展自己。
Typescript
允许接口继承多个接口。
继承使用关键字extends
// 单继承
interface IPerson{
age:number
}
interface IName extends IPerson{
name:string
}
let lady:IName={
name:"杨超越",
age:20
}
// 多继承
interface IFatherMoney{
m1:number
}
interface IMotherMoney{
m2:number
}
interface ISon extends IFatherMoney,IMotherMoney{
s:number
}
let money:ISon={
m1:100,
m2:100,
s:100
}
console.log(`子代一共有${money.m1+money.m2+money.s}万元`);
相同点:
都可以描述属性或方法
都允许拓展
不同点:
type可以声明基本数据类型,联合类型,数组等;
interface只能声明变量
当出现使用type和interface声明同名的数据时;
type会直接报错;
interface会进行组合
type不会自动合并;interface会
// 相同点:
type wonenStar ={
name:string
age:number
perform():any
}
interface IWSar{
name:string
age:number
perform():any
}
let star1={
name:"杨紫",
age:20,
perform(){
return "家有儿女"
}
}
let star2 = {
name:"李一桐",
age:18,
perform(){
return "射雕英雄传"
}
}
// 2.都允许扩展
type money1={
x1:number
}
type money2=money1&{
x2:number
}
let money:money2={
x1:10,
x2:20
}
interface IStar1{
name:string
}
interface IStar2 extends IStar1{
age:number
}
let star:IStar2={
name:"范冰冰",
age:26
}
// 不同点:
// 1.type可以声明基本数据类型,联合类型,数组等
// interface只能声明变量
type age = number;
type info = string | number | boolean;
type beautyList = [string | number];
// interface Iage = number; //报错
// 2.当出现使用type和interface声明同名的数据时
// type会直接报错
// interface会进行组合
// type mygoddassName = {
// name:string
// }
// type mygoddassName = {
// name:number
// }
interface mygoddassName{
name:string
}
interface mygoddassName{
name:string
age:number
}
let goddass:mygoddassName = {
name:"赵丽颖",
age:20