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
64 0
|
5月前
|
JavaScript 前端开发
理解包装对象类型
理解包装对象类型
31 0
|
7月前
|
Java
如何在类中实现并调用多个接口中的共享方法。
如何在类中实现并调用多个接口中的共享方法。
54 1
|
7月前
|
SQL Java 数据库连接
JAVAJDBC中常用的接口和类
JAVAJDBC中常用的接口和类
91 0
|
JSON JavaScript 开发工具
对象和接口-2:常见用法
本实验将介绍TypeScript中的对象类型的常见用法
对象和接口-2:常见用法
|
Java 编译器
类 对象 封装
类 对象 封装
77 0
|
弹性计算 JavaScript 开发工具
对象和接口-3:接口类型
本实验将介绍TypeScript中的接口类型
|
弹性计算 JavaScript 开发工具
对象和接口-1:对象类型
本实验将介绍TypeScript中的对象类的基本语法
|
Java
教你如何封装自定义函数式接口
前言 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包,和传统数学上的意义有区别。【摘自百度百科】
169 0
|
C# 索引
C#编程-98:索引器在接口中的使用
C#编程-98:索引器在接口中的使用
122 0
C#编程-98:索引器在接口中的使用