TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)

文章目录

接口_可选属性

 接口_只读属性

接口_额外的属性检查 

接口_ 函数类型 

 接口_类类型

接口_继承接口


接口_可选属性

接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 可选属性在应用 “option bags” 模式时很常用,即给函数传入的参数对象中只有部分属性赋值了 

带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个 ? 符号 

interface SquareConfig {color?: string;width?: number;
}
function createSquare(config: SquareConfig)
{let newSquare = {color: "white",area: 100}if (config.color) {newSquare.color = config.color;}if (config.width) {newSquare.area = config.width * config.width;}return newSquare;
}
let mySquare = createSquare({ color: "black"
});
console.log(mySquare)

 可选属性的好处之一是可以对可能存在的属性进行预定义,好处之二是可以捕获引用了不存在的属性时的错误。 比如,我们故意将 createSquare 里的 color 属性名拼错,就会得到一个错误提示

interface SquareConfig {color?: string;width?: number;
}
function createSquare(config:SquareConfig){let newSquare = { color: "white", area: 100 };if (config.clor) {// Error: Property 'clor' does not exist on type 'SquareConfig'newSquare.color = config.clor;}if (config.width) {newSquare.area = config.width * config.width;}return newSquare;
}
let mySquare = createSquare({ color: "black"});

 接口_只读属性

一些对象属性只能在对象刚刚创建的时候赋值。 你可以在属性名前用 readonly 来指定只读属性 

对象操作 

interface Point {readonly x: number;readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!

 函数操作

interface Point {readonly x: number;readonly y: number;
}
function MyPoint(ps:Point){const pt = {x:100,y:200}// Cannot assign to 'x' because it is a read-only property.ps.x = pt.x;ps.y = pt.yconsole.log(ps)
}
MyPoint({ x:100,y:200 })

 readonly vs const

最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const ,若做为属性则使用 readonly 

接口_额外的属性检查 

我们知道。接口具有“option bags” 模式,那我们来看下面的例子 

interface SquareConfig {color?: string;width?: number;
}
function createSquare(config: SquareConfig) {console.log(config)
}
let mySquare = createSquare({width: 100 });

现在多了一个需求,在传入的参数中,可能会传入未知参数 colour 因为有“option bags” 模式,会不会允许我们传入未知参数呢?

interface SquareConfig {color?: string;width?: number;
}
function createSquare(config: SquareConfig) { }
let mySquare = createSquare({ colour: "red",width: 100 });

然而,TypeScript 会认为这段代码可能存在 bug
对象字面量会被特殊对待而且会经过“额外属性检查”,你会得到一个错误

error: Object literal may only specify known properties, but 'colour' does not exist in type 'SquareConfig'. Did you mean to write 'color'?

 我们可以通过添加额外属性的方式解决这个问题

interface SquareConfig {color?: string;width?: number;[propName: string]: any;
}
function createSquare(config: SquareConfig)
{console.log(config)
}
let mySquare = createSquare({ colour: "red", width: 100 });

还有最后一种跳过这些检查的方式,这可能会让你感到惊讶,它就是将这个对象赋值给一个另一个变量: 因为 squareOptions 不会经过额外属性检查,所以编译器不会报错

interface SquareConfig {color?: string;width?: number;
}
function createSquare(config: SquareConfig)
{console.log(config)
}
const squareObj = { colour: "red", width: 100 }
let mySquare = createSquare(squareObj);

要留意,在像上面一样的代码里,你可能不应该去绕开这些检查,这不利于代码可读性与纠错性

接口_ 函数类型 

接口能够描述 JavaScript 中对象拥有的各种各样的外形。 除了描述带有属性的普通对象外,接口也可以描述函数类型

interface SearchFunc {(source: string, subString: string)
}

这样定义后,我们可以像使用其它接口一样使用这个函数类型的接口

let mySearch: SearchFunc;
mySearch = function (source: string, subString: string) {console.log(source,subString)
};
mySearch("Hello","World")

对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配

interface SearchFunc {(source: string, subString: string)
}
let mySearch: SearchFunc;
mySearch = function (sou: string, sub: string) {console.log(sou,sub)
}
mySearch("Hello","World")

 接口_类类型

与传统面向对象里接口的基本作用一样,TypeScript 也能够用它来明确的强制一个类去符合某种契约 

interface UserInterface {job:string
}
class Teacher implements UserInterface {public job:stringpublic name:stringpublic age:stringconstructor(name,age){this.name = name;this.age = age}
}

你也可以在接口中描述一个方法,在类里实现它

interface UserInterface {job:stringsayHello(j:string):void
}
class Teacher implements UserInterface {public job:stringpublic name:stringpublic age:stringconstructor(name,age){this.name = name;this.age = age}sayHello(j: string) {this.job = jconsole.log(j,this.name,this.age)}
}
const t = new Teacher("张三","20");
t.sayHello("itxiaotong")

接口_继承接口

和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里 

interface Info{name:stringage:number
}
interface Job extends Info{job:string
}
function user(userInfo:Job){console.log(userInfo)
}
user({ name:"iwen",age:20,job:"itxiaotong" })

 一个接口可以继承多个接口,创建出多个接口的合成接口

interface Info{ name:stringage:number
}
interface Num{num:number
}
interface Job extends Info,Num{job:string
}
function user(userInfo:Job){console.log(userInfo)
}
user({name:"iwen",age:20,job:"itbaizhan",num:1001
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293407.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

itk中的配准整理

文章目录 Perform 2D Translation Registration With Mean Squares效果:源码: 多模态互信息配准 Perform Multi Modality Registration With Viola Wells Mutual Information效果图源码: Register Image to Another Using Landmarks 通过标记点配准图像效果图源码 Perform 2D T…

探索Qt 6.3:了解基本知识点和新特性

学习目标: 理解Qt6.3的基本概念和框架:解释Qt是什么,它的核心思想和设计原则。学会安装和配置Qt6.3开发环境:提供详细的步骤,让读者能够顺利安装和配置Qt6.3的开发环境。掌握Qt6.3的基本编程技巧:介绍Qt6.…

[python]python实现对jenkins 的任务触发

目录 关键词平台说明背景一、安装 python-jenkins 库二、code三、运行 Python 脚本四、注意事项 关键词 python、excel、DBC、jenkins 平台说明 项目Valuepython版本3.6 背景 用python实现对jenkins 的任务触发。 一、安装 python-jenkins 库 pip install python-jenkin…

react生命周期详解,代码示例(新生命周期,与旧生命周期对比)

旧生命周期:https://blog.csdn.net/kkkys_kkk/article/details/135130549?spm1001.2014.3001.5501 目录 React 生命周期中常见的坑 为什么要移除 “will” 相关生命周期方法呢? Fiber是什么 新生命周期图示 新增生命周期与功能变化 完整生命周期…

批量获取虾皮shopee商品详情信息的方法分享(API免费测试)

在当今的电子商务环境中,数据是至关重要的。对于电商平台的商家和开发者来说,获取商品详情信息是他们日常工作的关键部分。虾皮Shopee作为东南亚最大的电商平台,其商品信息对于商家和开发者来说具有极高的价值。本文将分享如何通过API批量获取…

【Java】spring

一、spring spring是一个很大的生态圈,里面有很多技术。 其中最基础的是spring framework,主要的技术 是springboot以及springcloud。 1、spring framework spring framework是spring生态圈中最基础的项目,是其他项目的基础。 1.1、核心…

蓝桥杯:日期问题

目录 引言一、日期问题1.题目描述2.代码实现3.测试 二、回文日期1.题目描述2.代码实现3.测试 引言 关于这个蓝桥杯的日期问题,其实有一个明确的思路就感觉很简单,这个思路就是不用依照日期的顺序去把每一天走完,而是根据一个数加一&#xff…

亿发零售云引领新零售时代:智能收银系统助力连锁门店多业态发展

近来,越来越多零售从业者认识到,线上和线下全渠道整合将成为国内消费市场的主要趋势。在这个趋势中,线下门店仍然被视为品牌发展的重要价值来源。 在连锁门店中,收银系统被认为是运营管理的关键工具,能够为品牌门店提供…

Kylin基础知识点解析与应用探索

目录 学习目标: 学习内容: 学习时间: 学习产出: Kylin简介 什么是Kylin Kylin的历史和发展 Kylin在大数据领域的地位和作用 Kylin架构 Kylin的组成部分和模块 Kylin的工作原理和流程 Kylin与其他大数据组件的关系和集成 Kylin功能…

C语言操作符详解+运算符优先级表格

目录 前言 一、操作符是什么? 二、操作符的分类 三、算术操作符 四、逻辑操作符 五、比较操作符 六、位操作符 七、赋值操作符 八、其他操作符 九、运算符优先级表格 总结 前言 在编写程序时,最常用到的就是操作符,本文将详细的介绍…

JNI学习(二)

静态注册 接着上篇博客学习 JNI函数 JNIEXPORT void JNICALL Java_com_example_jnidemo_TextDemo_setText(JNIEnv *env, jobject this, jstring string){ __android_log_print(ANDROID_LOG_ERROR, "test", "invoke set from C\n");char* str (char*)(*e…

在Linux系统中安装MySQL数据库

目录 一、MySQL简介 二、MySQL安装步骤 1、下载MySQL的YUM仓库文件 2、安装MySQL源 3、解决密钥异常问题 4、安装MySQL服务器 5、开启MySQL服务 6、查看MySQL服务器中root用户的初始密码 7、使用初始密码登录MySQL服务器 8、修改root用户登录MySQL服务器的密码 三、…