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


目录
相关文章
|
数据采集 自然语言处理 算法
如何使用Python的Gensim库进行自然语言处理和主题建模?
使用Gensim库进行Python自然语言处理和主题建模,包括:1) 安装Gensim;2) 导入`corpora`, `models`, `nltk`等相关模块;3) 对文本数据进行预处理,如分词和去除停用词;4) 创建字典和语料库;5) 使用LDA算法训练模型;6) 查看每个主题的主要关键词。代码示例展示了从数据预处理到主题提取的完整流程。
400 3
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的美容院管理系统
本研究针对传统美容院管理效率低、信息化程度不足的问题,基于Spring Boot框架设计并实现一套高效、智能的美容院管理系统。系统融合Vue前端技术与MySQL数据库,集成客户管理、在线预约、库存监控等功能,提升运营效率与用户体验。结合国内美容行业数字化转型趋势,利用B/S架构与云计算优势,推动管理模式向智能化升级,助力企业降本增效,促进服务精细化发展。
|
网络协议 网络安全
ssl证书下载
【10月更文挑战第4天】ssl证书下载
552 3
|
数据采集 存储 数据挖掘
淘宝天猫商品评论数据接口 —— 电商决策的宝贵资源
在电商竞争中,淘宝天猫商品评论数据接口为技术员提供了宝贵的用户反馈资源,帮助深入了解用户需求、评估产品质量、监测竞争对手,从而优化产品和服务,提升竞争力。使用时需遵守平台规定,确保数据安全。
盒式交换机堆叠配置
盒式交换机堆叠配置
348 0
|
网络协议 网络安全 Python
Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息
237 0
|
图形学 开发者
【unity小技巧】FPS游戏后坐力制作思路
【unity小技巧】FPS游戏后坐力制作思路
591 0
|
机器人 Shell Linux
ROS_LOCALHOST_ONLY变量
ROS_LOCALHOST_ONLY变量
433 0
|
机器学习/深度学习 Apache 计算机视觉
OpenCV的版本
OpenCV的版本。
266 0
|
SQL 关系型数据库 PostgreSQL