接口 interface
对象类型
接口 interface – 常用于
I)自定义一个对象类型,定义一种约束
interface Axxs{
name: string
age?: number
[propNames:string]:any
readonly cb:()=>boolean
}
let a:Axxs = {
name: "白子",
a: 1,
b: '2',
c: true,
cb:()=>{return false;}
}
- 属性不能多,也不能少,如上代码中的 Axxs 和 a 都有且只能有 name 属性
- 若 interface 重复定义同名对象类型,会合并到一起,不是覆写,是相当于取并集
- 可以使用索引签名来一次性注册多个属性,如上面代码的 propNames:string 就是 a,b,c 的索引签名,原理是:设置了索引签名后,interface 将不会对后续的变量进行强检验
- 可选属性,在属性名后加 “?” 后将可以设置为可选
- readonly : 常用于函数,毕竟函数一般不能随意更改; ID 也是
- 接口继承: extends 多个 interface 定义的对象类型,可以将对应的接口继承过来
II)interface 定义函数类型:
interface Fn{
(name:string):number[]
}
const fn:Fn = function () {
return [1,2,3]
}
数组类型
使用 interface 定义,以下是只能 number 类型的数组的定义
number[] / Array<number> 二维 number[][] 推荐 / Array<Array<number>>
多种数据类型的数组
let arr1:[number,string,boolean] = [123,'baizi',true] // 必须一一对应
let arr2:[any] = [123,'baizi',true] // 可以添加任何类型的元素
也可以用函数定义数组
function Arr(...args:any[]){
console.log(args)
}
Arr(1,2,3)
console.log(Arr); // [1,2,3]
拓展:
arguments 本身是伪数组,缺少数组的常用方法,TS 提供内置对象 “ IArguments ” 去定义 arguments
function Arr(...args:any[]){
let Arr:any[] = arguments //Type 'IArguments' is missing the following properties from type 'any[]': pop, push, concat, join, and 24 more.
let Arr:IArguments = arguments //成功
let Arr:A = arguments //成功
}
interface A{
callee:Function
length:number
[index:number]:any
}