typescript学习03对象的类型接口interface(1)

188 阅读1分钟

在ts中我们用**接口**来定义对象的类型(Interfaces)

接口一方面用于对对象的**形状进行描述
另一方面对类的
一部分行为进行抽象**

这里我们对第一个场景进行讨论:
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp在**确定属性**的情况下 我们在创建对象变量时,比接口少了一些属性或多一些属性都是不允许的。

可选属性

任意属性

一个接口中只能定义一个任意属性。

interface Person {
		name: string;
        age: number;
        [propName: string]: any; // [propName: string]定义了任意属性取 string 类型的值。
      
}

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

interface Person {
    name: string;
    age?: number;
    [propName: string]: string;
}

let tom: Person = {
    name: 'Tom',
    age: 25,
    gender: 'male'
};
// Property 'age' of type 'number' is not assignable to string index type 'string'.

报错 age的类型number不是任意属性的类型string的子集

补救:

  1. 将任意属性的类型改为 确定属性 和 可选属性 的父集 比如说 any
  2. 采用联合类型的方式 去满足 接口中有多个类型的属性 上面的例子改为: [propName: string]: string | number;

只读属性

报错信息:用 readonly 定义的属性 id 初始化后,又被赋值了,所以报错了。

同时要注意 这里的初始化 时对该对象的初始化 而不是对该属性,见下面的例子: