07 # 接口:对象类型接口

简介: 07 # 接口:对象类型接口

接口定义

interface List {
    id: number;
    name: string;
}
interface Result {
    data: List[];
}
function render(result: Result) {
    result.data.forEach(value => {
        console.log(value.id, value.name);
    })
}
let result = {
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
};
render(result);


如果传入对象字面量的话,ts 会对额外的字段进行类型检查,sex 就会报错

render({
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
})


绕过这种检查的方法一共有三种

第一种:就是上面赋值给一个变量,然后传入

第二种:使用类型断言(明确告诉编译器我们的类型就是 Result,这样编译器就会绕过检查)

render({
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
} as Result);


或者使用 <Result>,建议使用 as,这种在 react 中会产生歧义

render(<Result>{
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
});


第三种:使用字符串索引签名:用任意的字符串去索引 List

interface List {
    id: number;
    name: string;
    [x: string]: any;
}


接口成员属性

可选属性

interface List {
    id: number;
    name: string;
    // [x: string]: any;
    age?: number;
}
interface Result {
    data: List[];
}
function render(result: Result) {
    result.data.forEach(value => {
        console.log(value.id, value.name);
        if(value.age) {
            console.log(value.age);
        }
    })
}
let result = {
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
};
render(result);


只读属性:不容许修改

interface List {
    readonly id: number;
    name: string;
    // [x: string]: any;
    age?: number;
}
interface Result {
    data: List[];
}
function render(result: Result) {
    result.data.forEach(value => {
        console.log(value.id, value.name);
        if(value.age) {
            console.log(value.age);
        }
        value.id++; // 无法为“id”赋值,因为它是只读属性。
    })
}
let result = {
    data: [
        { id: 1, name: 'a' , sex: "male"},
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
    ]
};
render(result);


不确定一个接口中有多少属性时,就可以使用可索引类型的接口,可以用数字跟字符串去索引。

用数字索引的接口:

interface StringArray {
    [index: number]: string;
}
let chars: StringArray = ["A", "B"];


用字符串索引的接口:

interface Names {
    [x: string]: string;
    // y: number // 类型“number”的属性“y”不能赋给“string”索引类型“string”。
    // 混用
    [y: number]: string;
}


目录
相关文章
|
Java
类与接口介绍
在Java中,类和接口是两种重要的概念,用于描述对象的属性和行为。它们是面向对象编程的基础,用于组织和管理代码。 类(Class)是一种模板或蓝图,用于创建对象。它定义了对象的属性和行为。类是Java中最基本的组织单元,所有的对象都是根据类来创建的。类由字段(属性)和方法组成。字段表示对象的状态或属性,而方法表示对象的行为或操作。 以下是一个简单的Java类的示例: ```java public class Person { // 字段 private String name; private int age; // 构造方法 publi
66 0
|
7月前
|
Java
如何在类中实现并调用多个接口中的共享方法。
如何在类中实现并调用多个接口中的共享方法。
56 1
|
7月前
|
SQL Java 数据库连接
JAVAJDBC中常用的接口和类
JAVAJDBC中常用的接口和类
106 0
|
7月前
08 # 接口:函数类型接口
08 # 接口:函数类型接口
37 0
|
JSON JavaScript 开发工具
对象和接口-2:常见用法
本实验将介绍TypeScript中的对象类型的常见用法
对象和接口-2:常见用法
|
弹性计算 JavaScript 开发工具
对象和接口-3:接口类型
本实验将介绍TypeScript中的接口类型
|
弹性计算 JavaScript 开发工具
对象和接口-1:对象类型
本实验将介绍TypeScript中的对象类的基本语法
|
存储 JSON 缓存
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
看看人家在接口中使用枚举类型的方式,那叫一个优雅!上
|
存储 消息中间件 JavaScript
看看人家在接口中使用枚举类型的方式,那叫一个优雅!下
看看人家在接口中使用枚举类型的方式,那叫一个优雅!下
|
C++
接口 vs 类型别名
接口 vs 类型别名
76 0