可选属性

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. LAMP架构部署及配置

    httpd编译安装 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 systemctl stop firewalld systemctl disable firewalld seten ...

  2. WebWorker:工作者线程初探

    WebWorker:工作者线程初探 参考资料: 1.Web Worker 使用教程 - 阮一峰:http://www.ruanyifeng.com/blog/2018/07/web-worker.ht ...

  3. super与this关键字图解和java继承的三个特点

    java继承的三个特点 java语言是单继承的 一个类的直接父类只能有一个 class A{} class B extends A{}//正确 class C{} class D extends A, ...

  4. java关键字的概念与特征和标识符的概念和规则

    什么是关键字 比如说邮箱地址 abc@qq.com  123abc@qq.com 这样的只要没有人占用都是和发布的 那么这样呢 hahah@enen@itcast.cn呢 @是电子邮箱当中有特殊含义的 ...

  5. mysql grant命令

    增删改查的权限grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant ...

  6. 彻底弄清楚session,cookie,sessionStorage,localStorage的区别及应用场景(面试向)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_94 客户端状态保持是一个老生常谈的问题了,归根结底追踪浏览器的用户身份及其相关数据无非就是以下四种方式:session,cooki ...

  7. [LNOI2022]盒

    \(LNOI2022\)盒 由于是加的形式,那么可以套路的拆贡献,枚举每条边的贡献就好了 \(40pts\) //比较显然的事情 //首先确定了一个B数组之后 //最小的移动应该是 //设左右两侧比原 ...

  8. Webstorm设置背景图为Windows桌面背景

    桌面背景图会缓存在这个目录中,文件名不确定在改变桌面背景后会不会变. C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles ...

  9. [Android开发学iOS系列] 工具篇: Xcode使用和快捷键

    [Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...

  10. 聊天机器人框架Rasa资源整理

      Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性.参考文献收集了一些Rasa相关的开源项目和优质文章. 一.Rasa介绍 1.R ...