在实际应用开发的场景中,用typescript接口基础很常见的。比如像大项目,有几个对象也可以实现了一个接口,通过接口interface可以获取方法、属性等,对开发来说是比较方便的。咱们来看看typescript接口是什么样子的。
1.接口例子
interface text{
title:string
}
function print(textObj:text){
console.log(textObj.title)
}
let myTitle = {num:23,title:"my is pig"};
print(myTitle)
解析:类型检查器会查看text的调用。text有一个参数,并要求这个对象参数有一个名为title、类型为string的属性。需要注意的是,我们传入的对象参数实际上会包含很多属性,但是编译器只会检查那些必备的属性是否存在。
2.重名以及重合
interface Mother {
name:string,
age:number
}
interface Mother{
isModel:boolean
}
// 重合
const ther:Mother = {
name:'james',
age:39,
isModel:false
}
出现定义同名的接口的时候,它们会进行重合。
3.任意属性key
任意属性[propName:string],注意:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的子集。
interface Person {
name:string,
age:number,
[propName:string]:any
}
const tom:Person = {
name:'james',
age:26,
a:1,
b:2,
c:'title'
}
以上的写法是没问题
但是想想如下:
interface Person1 {
name:string,
age:number,
[propName:string]:string
}
const personResult:Person1 ={
name:'title',
age:26,
grend:'baidu'
}
为什么报错,首先任意属性的类型是stirng,但是却age的类型是number,因为number不是string的子集,所以报错的。
另外一个报错信息:
不能将类型“{ name: string; age: number; grend: string; }”分配给类型“Person1”。 属性“age”与索引签名不兼容。 不能将类型“number”分配给类型“string”。 这是叫联合类型和接口的结合
如何解决这个问题?
如果在接口中任意属性只有一个类型,只能定义对应的一个类型。如果任意属性中多个类型,则可以在任意属性中使用多个联合类型,如下:
interface Persons {
name:string,
age:number,
is:boolean,
[propName:string]:string|number|boolean
}
const result:Person = {
name:'james',
age:29,
is:false,
grend:'string',
price:200,
}
4.可选属性(?)
在接口中属性读取不到怎么办?可以使用可选属性,则使可选属性不存在且不会报错的。
interface Person {
name:string,
age:number,
title?:string
}
const result:Person = {
name:'james',
age:28,
}
可以看到以上的例子:title属性不存在且不会报错的。
5.接口继承
interface A extends B {
name:string,
age:number
}
interface B{
title:string
}
const result3:A = {
name: 'james',
age: 30,
title: '篮球活动',
}
接口A继承接口B,也就是说接口A和接口B的对象内合并。
6.定义函数类型
interface Person {
(name:number):number[]
}
const fn:Person = (name:number)=>{
return [43,23,231]
}
接口可以使用函数的。