可选属性

type类型别名

type 会给一个类型起个新名字。 type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型。

interface

TypeScript 的核心原则之一是对值所具有的结构进行类型检查。 而接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。

这段代码给Pearent 定义了三个属性---Shape,xPop,yPop

后面跟的 ? 代表的是可选也就是可传入可不传入。

再函数形参中我们进行xPop = 0设置的意义是如果不传入xPop,则默认值设为 0

interface Pearent {
Shape:Shape,
xPop?:number,
yPop?:number
} ###
![](https://img2022.cnblogs.com/blog/2752939/202202/2752939-20220223111442584-1618479204.png) function Pearent({Shape,xPop = 0,yPop = 0}:Pearent){
let xpop = xPop
console.log(" ~ file: 02-可选属性.ts ~ line 10 ~ Pearent ~ xPop", xpop)
} Pearent({Shape:`小红`})
Pearent({Shape:1,xPop:1})

只读属性

在属性前面加上readonly 关键字,变成只读属性

interface Home {
readonly resident :{
age:number,
name:string
}
} function visit(home:Home){
console.log(home.resident.age);
// 但是可以修改只读属性内部属性
home.resident.age ++
} function evict (home:Home){
// 修改只读属性就会报错
// home.resident= {
// name:`小红`
// age:18
// }
}

可以将可写的属性赋值给不可写的属性,实现属性修改

// 可读属性
interface person{
name:string,
age:number
}
//不可读写属性
interface readonlyPerson{
readonly name:string,
readonly age:number
}
//可读写数据
let newPerson:person = {
name:`小红`,
age:18
}
//将可读写数据赋给不可读写数据
let newPersons:readonlyPerson = newPerson
console.log(newPersons.age);//18
newPerson.age ++
console.log(newPersons.age);//19

索引签名

索引签名在实际开发中经常用到,例如服务端接口返回了很多数据但是存在我们不需要用的,如果定义接口的时候不定义它们会报错,这时我们使用索引签名,就可以避免这个问题

注意:TypeScript 的索引签名必须是 string 或者 number。索引签名的名称(如:{ [index: string]: { message: string } } 里的 index )除了可读性外,并没有任何意义。例如:如果有一个用户名,你可以使用 { username: string}: { message: string },这有利于下一个开发者理解你的代码。当你声明一个索引签名时,所有明确的成员都必须符合索引签名:

interface qingTian {
[props:string]:number
}
let Top = {
x:1,
b:2
} interface Animal {
name:string
}
interface Dog extends Animal{
befff : string
} interface Monky {
[index:string]:number|string
name:string
length:number
} let momky:Monky ={
name:`小花`,
length:2
} interface readOnly {
readonly [index:number]:string
}
let myarr:readOnly = [`a`,`b`,`c`]
// myarr[0]= b

扩展类型

通过interface定义多个接口类型,用extends继承属性,如果多类型,可以在extend后面的类型中继续加,用‘ ,’逗号链接

interface Zoom {
name:string,
age:number,
color?:string
} interface Top extends Zoom{
unit:string
} let address:Top = {
name:`小红`,
unit:`小蓝`,
age:18
}
interface circular {
radius:number
}
interface length{
length:number
}
interface less extends circular,length{
ref:boolean
}

交叉类型

交叉类型其实和扩展类型差不多,都是让两个类型为一个类型或变量服务。

interface RNG {
Ming:string
}
interface OMG{
Fafer:string
}
// type LPL = OMG & RNG // let LPL:LPL ={
// Fafer:`小红`,
// Ming:`小明`
// }
function LPL(LPL:RNG&OMG){
console.log(LPL.Fafer);
console.log(LPL.Ming);
}
LPL({
Ming:`小明`,
Fafer:`小李`
})

看上去交叉类型和扩展类型是相似的,但是他们也有一丝的差别,就是在处理冲突的时候。

interface 允许变量名相同,并且会把相同变量名的属性整合在一起。

type 不允许创建相同变量名

// interface Sister {
// name:string
// }
// interface Sister{
// age:number
// }
// let person:Sister ={
// name:`小红`,
// age:12
// } type Sister ={
name:string
}
type Sister

泛型类型对象

//这样判断为any失去了定义类型的意义
interface x {
contens:any
}
let box:x ={
contens:`什么类型都可以`
}
//使用unkown
interface y{
contens:unknown
}
let y:y = {
contens:`Hello , word`
}
// 使用类型缩小
if(typeof y.contens===`string`){
console.log(y.contens.toLocaleLowerCase()); }
// 使用类型断言
console.log((y.contens as string).toLocaleLowerCase()); // 使用函数重载定义
interface numberBOX {
contents:number
}
interface stringBox{
contents:string
}
interface booleanBox{
contents:boolean
}
function setContents (box:numberBOX,newBox:number):void
function setContents (box:stringBox,newBox:string):void
function setContents (box:booleanBox,newBox:boolean):void function setContents(box:{contents:any},newBox:any){
box.contents = newBox
}
// 使用泛型对象定义
interface Box<type> {
contents:type
}
interface Apple{
// ...
}
let a:Apple = {} type AppleBox = Box<Apple>
let ab:AppleBox = {
contents:a
} type Box1<type> = {
contents:type
}
type Oneornull<type> = type|null
type OneorMany<type> = type | type[]

typescript中对象属性可选属性与只读属性与索引签名的更多相关文章

  1. javascript中对象访问自身属性的方式

    在javascript中,通过对象的方法访问对象自身属性时,必须采用this.fieldName的方式. 原因是javascript中Function是无状态的,访问对象的属性时,必须指定当前的上下文 ...

  2. C#中获取多个对象list中对象共有的属性项

    场景 有一组数据list<TestDataList> 每一个TestDataList是一个对象,此对象可能有温度数据,也可能没有温度数据. 有温度数据的情况下,温度数据属性又是一个list ...

  3. java1.8对集合中对象的特有属性进行排序

    每天学习一点点,知识财富涨点点 1.创建对象user12 2.编写测试类 3.输出结果 加油!!!!

  4. JS 取Json数据中对象特定属性值

    解析JSON JSON 数据 var str = '[{"a": "1","b": "2"}, {"a&quo ...

  5. Structs2中iterator的status属性的用法

    iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用<s:iterator/>标签的时候有三个属性值得我们关注 1. value属性:可选的属性,va ...

  6. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  7. 巧用call,appl有 根据对象某一属性求最大值

    查找对象数组中某属性的最大最小值的快捷方法 例如要查找array数组中对象的value属性的最大值 var array=[ { "index_id": 119, "are ...

  8. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  9. JavaScript中对象的属性

    在JavaScript中,属性决定了一个对象的状态,本文详细的研究了它们是如何工作的. 属性类型 JavaScript中有三种不同类型的属性:命名数据属性(named data properties) ...

随机推荐

  1. APISpace 尾号限行API接口 免费好用

    尾号限行是一种为了缓解城市交通压力而催生的交通制度,措施实施以后对城市交通拥堵起到缓解作用.每个地区的尾号限行规定都有所不同,具体的以当地的为准.   尾号限行API,提供已知所有执行限行政策的共计6 ...

  2. SQL语句的整合

    基础语法 https://blog.csdn.net/m0_37989980/article/details/103413942 CRUD 提供给数据库管理员的基本操作,CRUD(Create, Re ...

  3. html元素height(width)是怎么确定的?

    1.若height是确定的(比如height:100px),则height直接可确定(还受min-height,max-height影响,见height,min-height,max-heigth的作 ...

  4. 关于微信小程序生产环境体验版获取不到openId的问题(大坑)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_119 我们知道openid是微信用户验证的重要标识,支付功能严重依赖这个东西,之前我们做微信支付的时候是通过在微信客户端直接调用官 ...

  5. MySQL 常见索引类型介绍

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL 主要索引类型有如下几种: 1.主键索引 2.唯一索引 3.普通索引 4.空间索引 5.全文索引 假设有如下一张 ...

  6. 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...

  7. Java集合容器的深度理解

    Java容器里有很多写好的容器API,这使我们很方便的可以存储.操作我们的数据. 下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理 一.常用的容器目录 上图可以看出,java ...

  8. BZOJ4337 树的同构 (树哈希)(未完成)

    样例迷,没过 交了30pts #include <cstdio> #include <iostream> #include <cstring> #include & ...

  9. 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    项目场景:Mysql 实现数据库读写分离 搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1. 在服务搭建完毕后,利用客户机连接amoeb ...

  10. 【AGC】集成华为AGC崩溃服务实用教程

    ​简介 AppGallery Connect(简称AGC)崩溃服务提供了轻量级崩溃分析服务,集成Crash SDK,可以实现零代码快速集成,您的应用能够在崩溃时自动收集崩溃报告,帮助您了解应用版本质量 ...