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;
}


目录
相关文章
|
4月前
|
C++
几个实用的C++函数接口
几个实用的C++函数接口
|
7月前
|
Java
类与接口介绍
在Java中,类和接口是两种重要的概念,用于描述对象的属性和行为。它们是面向对象编程的基础,用于组织和管理代码。 类(Class)是一种模板或蓝图,用于创建对象。它定义了对象的属性和行为。类是Java中最基本的组织单元,所有的对象都是根据类来创建的。类由字段(属性)和方法组成。字段表示对象的状态或属性,而方法表示对象的行为或操作。 以下是一个简单的Java类的示例: ```java public class Person { // 字段 private String name; private int age; // 构造方法 publi
26 0
|
1月前
接口
使用使用接口的时候,需要注意: 1.接口是没有静态代码块或者构造方法的。 2,一个类只能继承一个,但是一个类可以同时实现多个接口。 格式: public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {} 3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。 4、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。 5如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进 行覆善重写。 6.一个类如果直接父类当中的方法,和接口当中的
9 0
|
2月前
|
SQL Java 数据库连接
JAVAJDBC中常用的接口和类
JAVAJDBC中常用的接口和类
14 0
|
2月前
|
存储 安全 Java
AVAList接口
AVAList接口
12 1
|
5月前
08 # 接口:函数类型接口
08 # 接口:函数类型接口
14 0
|
6月前
接口能玩的小花招
接口能玩的小花招
26 0
|
8月前
|
弹性计算 JavaScript 开发工具
对象和接口-3:接口类型
本实验将介绍TypeScript中的接口类型
110 0
|
Java Maven
一文了解ConfigurationConditon 接口
在了解ConfigurationCondition 接口之前,先通过一个示例来了解一下@Conditional 和 Condition。
92 0