首页 > 其他分享 >类型断言

类型断言

时间:2023-05-10 15:12:26浏览次数:21  
标签:断言 People 数据类型 Stu 类型 public string

断言

把两种能有重叠关系的数据类型进行相互转换的一种 TS 语法,把其中的一种数据类型转换成另外一种数据类型。类型断言和类型转换产生的效果一样,但语法格式不同。类型断言语法格式为 “A 数据类型的变量 as B 数据类型”(A 数据类型和 B 数据类型必须具有重叠关系)。以下几种场景都属于重叠关系;
  1)如果 A,B 是类,并且有继承关系; -【 extends 关系】无论 A,B 谁是父类或子类, A 的对象变量可以断言成 B 类型,B 的对象变量可以断言成A类型 。但大多数场景下都是把父类的对象变量断言成子类。   2)A,B 如果是类,但没有继承关系; -   两个类中的任意一个类的所有的 public 实例属性【不包括静态属性】加上所有的 public 实例方法和另一个类的所有 public 实例属性加上所有的 public 实例方法完全相同或是另外一个类的子集,则这两个类可以相互断言,否则这两个类就不能相互断言。 3)如果 A 是类,B 是接口,并且 A 类实现了 B 接口【implements】  ; -  A 的对象变量可以断言成 B 接口类型,同样 B 接口类型的对象变量也可以断言成A类型,类似第一项。
4)如果 A 是类,B 是接口,并且 A 类没有实现了 B 接口; - 则断言规则和第三项相同。 5)如果 A 是类,B 是 type 定义的数据类型; - 【就是引用数据类型,例如 Array, 对象,不能是基本数据类型,例如 string,number,boolean】,如果有 A 类实现了 B type 定义的数据类型【 implements】,则 A 的对象变量可以断言成 B type 定义的对象数据类型,同样 B type 定义的对象数据类型的对象变量也可以断言成 A 类型 。 6)如果 A 是类,B 是 type 定义的数据类型,并且 A 类没有实现 B type定义的数据类型; - 则断言规则和第二项相同。 7)如果 A 是一个函数上参数变量的联合类型;   - string |number,那么在函数内部可以断言成 string 或number 类型。
8)多个类组成的联合类型如何断言? -  例如:let vechile:  Car | Bus | Trunck。 vechile 可以断言成其中任意一种数据类型。 例如 vechile as Car, vechile as Bus , vechile as Trunck 。 9)任何数据类型都可以转换成 any 或 unknown 类型; -  any 或 unknown 类型也可以转换成任何其他数据类型。

A,B 是类,并且有继承关系 & 没有继承关系

// -----------------------> A,B是类,有继承关系
class People {
  public username!: string;
  public age!: number;
  constructor() {}
  step() {}
}

class Stu extends People {
  public username!: string
  public age!: number;
  public address!: string
  constructor(username: string, age: number, address: string) {
    super();
    this.address = address;
  }
  study() {}
}

let people = new People();
people.study() // 报错,找不到study

// 绝大多数是父类断言成子类
let result = people as Stu;// 类型断言 正确(父类断言成子类)
result.study();    // 正确,Stu类上有study方法

// 子类断言成子类父类
let stu = new Stu("wangwu", 23, "北京");
let result2 = stu as People; // 正确
result2.study() // 报错(类型“People”上不存在属性“study”)

// 如果是类型转换
let result = <Stu>people; // 类型转换 正确
result.study();

// -----------------------> A,B是类,没有继承关系,但是有一方的public属性覆盖另一方的
class People {
  constructor(
    public username: string,
    public age: number,
  ) {}
}
class Stu {
  public username!: string;
  public age!: number;
  public address!: string; 
  constructor(username: string, age: number, address: string) {
    super();
    this.address = address;
  }
  public study() {}
}

let people = new People("wangwu", 23);
let stuedConvert = people as Stu; // 没有报错,Stu包含了People的所有public属性,所以People的属性是Stu的子集

let stu = new Stu("wangwu", 23, "北京");
let peopledConvert = stu as People;    // 正确 People是Stu的子集

两个没有继承关系的类,只要其中一方所有的 public 实例属性【不包括静态属性】加上所有的 public 实例方法涵盖了另一个类的所有 public 实例属性加上所有的 public 实例方法,或是相同,则这两个类可以相互断言,否则这两个类就不能相互断言。

A 是类,B 是接口, A 类实现了 B 接口【implements】& 没有实现了 B 接口

interface People {
  username: string;
  age: number;
  address: string;
}

// Stu 实现了People接口
class Stu implements People {
  public username!: string;
  public age!: number;
  public address!: string;
}

// people对象实现了People接口
let people: People = {
  username: "wangwu",
  age: 23,
  address: "11",
};
let result = people as Stu; // 正确,people可以断言成Stu,Stu类实现看People接口
let stu = new Stu("wangwu", 23, "北京");
stu as People; // 正确,

// -----------------------> A是类,B是接口,没有继承关系,但是如果一方可以覆盖另外一方就可以断言,类似第二点
class Test {
  public username!: string;
  public age!: number;
  public address!: string;
  public phone!: string;
  public sex!: number;
  public old!: number;

  constructor(username: string, age: number, address: string) {
    this.address = address;
  }
}

let result = people as Test; //正确
let test = new Test("wangwu", 23, "北京");
test as People; // 正确,属性完全相同或者一方覆盖另外一方

A 是类,B 是 type 定义的数据类型并实现B type 数据类型 & 没有实现 B type定义的数据类型

和上述两个案例一样,如果A类实现了B type,那么可以相互断言,如果没有实现,并且一方的属性是另外一方的子集或者相同,同样可以断言

标签:断言,People,数据类型,Stu,类型,public,string
From: https://www.cnblogs.com/goather/p/17381575.html

相关文章

  • PMP-4.9-1 规划采购管理-合同类型、采购管理计划、采购策略、招标文件、采购工作说明
    ##############################################################前一章,我们说到了规划采购管理的一些基础内容,本章我们对采购过程中的一些具体文件内容做说明。这里强调一下,本次内容依旧是买方视角的采购管理流程,也就是甲方的视角。如需乙方视角,可留言评论,需求足够的话,我们再......
  • [oeasy]python0050_动态类型_静态类型_编译_运行
    动态类型_静态类型回忆上次内容上次了解了帮助文档的生成开头的三引号注释可以生成帮助文档文档可以写成网页 python3本身也有在线的帮助手册 目前的程序提高了可读性 ​ 添加图片注释,不超过140字(可选......
  • KingbaseES 分区表修改字段类型
    KingbaseES普通表修改表结构请参考:KingbaseES变更表结构表重写问题数据类型转换重写与不重写:varchar(x)转换到varchar(y)当y>=x,不需要重写。numeric(x,z)转换到numeric(y,z)当y>=x,或者不指定精度类型,不需要重写。numeric(x,c)转换到numeric(y,z)当y=xc>z,当numer......
  • KingbaseES 复制冲突之锁类型冲突
    背景昨天遇到客户现场的一个有关复制冲突的问题备库报错:ERROR:cancelingstatementduetoconflictwithrecovery,userwasholdingarelationlockfortoolong现场情景是备库执行逻辑备份过程中出现的报错,逻辑备份相当于备库查询语句,snapshot,这时主库业务繁忙,对备库查询......
  • 4. 基本数据类型
    1.整型int作用:记录年龄、身份证号、个数等等定义:age=18print(type(age))2.浮点型float作用:记录身高、体重、薪资等定义:salary=3.3weight=70print(type(salary),type(weight))**3.字符串类型str作用:记录描述性质的状态定义:用......
  • 聊一聊redis十种数据类型及底层原理
    概述Redis是一个开源的高性能键值数据库,它支持多种数据类型,可以满足不同的业务需求。本文将介绍Redis的10种数据类型,分别是string(字符串)hash(哈希)list(列表)set(集合)zset(有序集合)stream(流)geospatial(地理)bitmap(位图)bitfield(位域)hyperloglog(基数统计)String概述string......
  • VMware硬盘类型厚置备延迟置零 、 厚置备置零、精简置备的区别
    1、厚置备延迟置零(zeroedthick)以默认的厚格式创建虚拟磁盘。创建过程中为虚拟磁盘分配所需空间。创建时不会擦除物理设备上保留的任何数据,但是以后从虚拟机首次执行写操作时会按需要将其置零。简单的说就是立刻分配指定大小的空间,空间内数据暂时不清空,以后按需清空。 2、厚......
  • Java的数据类型
    基本数据类型|类别|数据类型|包装类|默认值||数值类型|整数类型|byte|Byte|0||数值类型|整数类型|short|Short|0||数值类型|整数类型|int|Integer|0||数值类型|整数类型|long|Long|0L|......
  • 台式机装Ubuntu 遇到“no root file system is defined”、安装类型上没有“删除直接
    今日,给清华要的两台电脑终于拿到手了(下午拿到的,具体坎坷经历见日报)。开始配环境,主要是三个步骤:1、装Linux2、装网卡和网卡驱动3、装GNU_radio一系列环境(见我上个月虚拟机的操作方案)今天完成了1和2.最恶心的是1.首先报的错误是,norootfilesystemisdefined,确实,但是为什么......
  • Httprunner修改response中数据类型
    支持的类型默认三种Text,bytes,Dict如果超出三种类型则报错Epydantic.error_wrappers.ValidationError:3validationerrorsforResponseDataEbodyEstrtypeexpected(type=type_error.str)EbodyEbytetypeexpected(type=type_error.bytes)EbodyE......