对象的类型

在typescript中,我们定义对象的方式要用关键字interface(接口),我的理解是使用interface来定义一种约束,让数据的结构满足约束的格式。定义方式如下:

 // 接口和对象
 //对象
 let obj = {
  name:"ZhangSan"
 }
 //接口 定义
 interface A{
  name:string
 }
 interface A{
  age:number
 }
 // 接口的声明实现
 // 重名的接口会被当做同一个接口
 // let obj2:A ={}  // 报错
 let obj2:A = {
  name:"张三",
  //接口的对象要实现完整
  age:18,
 }

image-20230103185529579

 //这样写是会报错的 因为我们在person定义了a,b但是对象里面缺少b属性
 //使用接口约束的时候不能多一个属性也不能少一个属性
 //必须与接口保持一致
 interface Person {
  b:string,
  a:string
 }
 ​
 const person:Person  = {
  a:"213"
 }
 //重名interface  可以合并
 interface A{name:string}
 interface A{age:number}
 var x:A={name:'xx',age:20}
 //继承
 interface A{
  name:string
 }
 ​
 interface B extends A{
  age:number
 }
 ​
 let obj:B = {
  age:18,
  name:"string"
 }

任意类型 [propName: string]:

格式: [propName: string] + 属性

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:

 interface A{
  age:number
  address?:string // 使用可选式操作符 使得该属性在对象中可选
  [propName: string]:any  //任意属性
  // 需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
  // 例如 [propName: string]:string  后该接口的所有属性都必须是string类型
  other?:string | number   // 联合类型 |
 }
 // 接口的声明实现
 // 重名的接口会被当做同一个接口
 // let obj2:A ={}  // 报错
 let obj2:A = {
  name:"张三",
  //接口的对象要实现完整  
  age:18,
  // address:"可选式"
  //因为定义了任意属性,所以可以添加任意类型
  money:100,
  abc:123
 }

只读属性 readonly

readonly 只读属性是不允许被赋值的只能读取

 //只读类型 readonly
 interface B{
  readonly name:string
  age?:number
  [propName: string]:any
 }
 let BB:B = {
  name:"李四",
  age:19,
 }
 // BB.name = "王五"    //报错

image-20230104180149525

接口中添加函数

 interface B{
  readonly name:string
  age?:number
  [propName: string]:any
  cb():number //定义返回值为 number 的函数
  db():void   //定义没有返回值的函数
 }
 let BB:B = {
  name:"李四",
  age:19,
  cb:():number => {
      return 123
  },
  db:() =>{}
 }

接口的继承

 //接口的继承 
 interface B{
  readonly name:string
  age?:number
  [propName: string]:any
  cb?():number //定义返回值为 number 的函数
  db?():void   //定义没有返回值的函数
 }
 interface C extends B{
  address:string
 }
 let CC:C = {
  name:"赵六",
  address:"继承",
 }

接口继承使用 extends 关键字,子接口中定义的属性不能改变父接口中相同名称的属性