vue3 + ts vue_3.4 setup单文件组件中的属性

props

各种类型

<script lang="ts" setup>
  import { ref, PropType } from 'vue';

  interface listType {
    addres: string;
    code: number;
  }

  interface ftObj {
    obj1: string[];
    obj2: {
      [key: string]: any;
    };
  }

  const props = defineProps({
    name: {
      type: String as PropType<string>,
      default: '默认footer name',
    },
    link: String as PropType<string>,
    list: {
      type: Array as PropType<listType[]>,
      default: () => {
        return [];
      },
    },
    obj: {
      type: Object as PropType<ftObj>,
      default: () => {
        return null;
      },
    },
  });
</script>

emit defineEmits

string number简单字符类型


    <input type="text" v-model="value" style="width: 150px" />
    ------------------------

  // 定义事件的类型
  type Emits = {
    (event: 'updateValue', value: string): void;
  };

  // 使用类型定义的 defineEmits
  const emitList = defineEmits<Emits>();

  watch(value, (nevVal, old) => {
    console.log('nevVal', nevVal);
    emitList('updateValue', nevVal);
  });

类型别名和接口之间的差异

类型别名和接口非常相似,在许多情况下,您可以在它们之间自由选择。 几乎所有的特性都可以在 中使用,关键的区别在于,一个类型不能被重新打开来添加新的属性,而一个接口总是可扩展的。interfacetype

在这里插入图片描述
–> 在 TypeScript 4.2 版之前,类型别名可能会出现在错误消息中,有时代替等效的匿名类型(这可能是可取的,也可能是不可取的)。接口将始终在错误消息中命名。
类型别名不能参与声明合并,但接口可以。
–> 接口只能用于声明对象的形状,而不能重命名基元。
–> 接口名称将始终以其原始形式出现在错误消息中,但仅当按名称使用时。
–> 在大多数情况下,您可以根据个人喜好进行选择,TypeScript 会告诉您是否需要其他声明。如果您想要启发式方法,请使用 直到您需要使用 中的特征。interfacetype

类型断言

有时,您将获得有关 TypeScript 无法知道的值类型的信息。

例如,如果你使用 ,TypeScript 只知道这将返回某种 ,但你可能知道你的页面将始终有一个给定的 ID。document.getElementByIdHTMLElementHTMLCanvasElement

在这种情况下,可以使用类型断言来指定更具体的类型:

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

== > 与类型注释一样,类型断言由编译器删除,不会影响代码的运行时行为。

您还可以使用尖括号语法(除非代码在文件中),这是等效的:.tsx

const myCanvas = <HTMLCanvasElement>document.getElementById("main_canvas");

提醒:由于类型断言是在编译时删除的,因此没有与类型断言关联的运行时检查。 如果类型断言错误,则不会出现异常或生成异常。null

TypeScript 只允许转换为更具体或更不具体的类型版本的类型断言。 此规则可防止“不可能”的胁迫,例如:

const x = "hello" as number;
Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.

有时,此规则可能过于保守,并且不允许可能有效的更复杂的胁迫。 如果发生这种情况,可以使用两个断言,首先是 to(或 ,我们将在后面介绍),然后是所需的类型:any unknown

const a = expr as any as T;

readonly

属性也可以标记为 TypeScript。 虽然它不会在运行时更改任何行为,但在类型检查期间无法写入标记为的属性。readonlyreadonly

interface SomeType {
  readonly prop: string;
}

使用修饰符并不一定意味着一个值是完全不可变的,或者换句话说,它的内部内容不能改变。 它只是意味着属性本身不能被重写。readonly

interface Home {
  readonly resident: { name: string; age: number };
}
 
function visitForBirthday(home: Home) {
  // We can read and update properties from 'home.resident'.
  console.log(`Happy birthday ${home.resident.name}!`);
  home.resident.age++;
}
 
function evict(home: Home) {
  // But we can't write to the 'resident' property itself on a 'Home'.
  home.resident = {
Cannot assign to 'resident' because it is a read-only property.
    name: "Victor the Evictor",
    age: 42,
  };
}

超额财产检查

请记住,对于像上面这样的简单代码,您可能不应该尝试“绕过”这些检查。 对于具有方法和保持状态的更复杂的对象文本,可能需要牢记这些技术,但大多数多余的属性错误实际上是 bug。

interface SquareConfig {
  color?: string;
  width?: number;
  [propName: string]: any; //若获取的对象中  有超额的属性 则这样做
}


  var s: SquareConfig = {
    color: '121',
    width: 123,
  };
  s.abc; //[propName: string]: any;  若没有这一段   将会报错

扩展类型

类型可能是其他类型的更具体版本是很常见的。


//例如,我们可能有一个类型来描述在美国发送信件和包裹所需的字段。BasicAddress

interface BasicAddress {
  name?: string;
  street: string;
  city: string;
  country: string;
  postalCode: string;
}


//在某些情况下,这就足够了,但如果地址的建筑物有多个单元,则地址通常具有与之关联的单元号。 然后,我们可以描述一个 .AddressWithUnit

interface AddressWithUnit {
  name?: string;
  unit: string;
  street: string;
  city: string;
  country: string;
  postalCode: string;
}

//这可以完成工作,但缺点是,当我们的更改纯粹是累加时,我们不得不重复所有其他字段。 相反,我们可以扩展原始类型,只需添加 唯一的新字段。

我们可以这样做 ^^^

interface BasicAddress {
  name?: string;
  street: string;
  city: string;
  country: string;
  postalCode: string;
}
 
interface AddressWithUnit extends BasicAddress {
  unit: string;
}

interface 也可以从多种类型扩展>>>>>

interface Colorful {
  color: string;
}
 
interface Circle {
  radius: number;
}
 
interface ColorfulCircle extends Colorful, Circle {}
 
const cc: ColorfulCircle = {
  color: "red",
  radius: 42,
};

interface 也可以交叉类型>>>

使用运算符定义交集类型 &

  interface Colorful {
    color: string;
  }
  interface Circle {
    radius: number;
  }

  function draw(circle: Colorful & Circle) {
    console.log(`Color was ${circle.color}`);
    console.log(`Radius was ${circle.radius}`);
  }

  // okay
  draw({ color: 'blue', radius: 42 });
  draw({ color: 'blue', radius234: 42 }); //这里会报错  因为没有 radius234 这个属性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C 练习实例50-使用Dev-C++创建项目(圆形体体积计算器)

项目展示 项目案例&#xff1a;圆形体体积计算器 vol.h文件 #include <stdio.h> #include <math.h> #define PI 3.141592654 void cal(int sel); //函数声明 double vol_ball(void); double vol_cylind(void); double vol_cone(void); main.c文件 #include &quo…

代理IP使用指南:风险与注意事项

在当今的数字化时代&#xff0c;使用在线代理IP已经成为一种常见的网络行为。然而&#xff0c;在使用这些代理IP时&#xff0c;我们需要注意一些风险和问题&#xff0c;以确保我们的网络安全和隐本私文。将探讨使用代理IP时需要注意的几个关键问题。 1、代理IP的安全性 使用代理…

【JavaLearn】#(29)Maven引入、Maven项目类型、Maven安装与配置、Maven项目的创建和使用、pom配置文件介绍

1. Maven引入 1.1 传统方式中项目jar包资源的问题 项目中的jar包资源&#xff08;如JDBC驱动包&#xff09;需要我们自己从网上下载&#xff0c;然后手动导入到项目中使用 –> 一旦jar包资源过多&#xff0c;容易造成遗漏&#xff0c;且不好管理 如果有两个项目&#xff0…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台&#xff0c;被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡&#xff0c;以实现数据采集和分析。 系统主要…

C#算法(11)—求三个点构成圆的圆心坐标和半径

前言 我们在上位机开发领域也经常会碰到根据三个点求出圆的圆心、半径等信息的场景,本文就是详细的介绍如何根据三个点使用C#代码求出三点构成的圆的圆心坐标、圆半径、三点构成的圆弧的角度。 1、3点求圆分析 A、B、C三个点都是圆上的坐标点,过向量AB做中垂线,过向量AC做…

HCIP寒假第十次作业

第一步&#xff0c;给pc配置IP192.268.1.2-192.168.1.4 第二步&#xff0c;在三个交换机上划分vlan [sw1]vlan 3 [sw1]interface e0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 3 [sw2]vlan 2 lsw2]interface e0/0/2 [sw2…

【c++】构造函数和析构函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

2024年第一篇博客

这是2024年的第一篇博客&#xff0c;2023年笔者经历了一连串的生活、工作、学习上的转折和调整&#xff0c;跌跌撞撞时光飞逝&#xff0c;转眼间就踏着元旦的钟声步入了2024年&#xff0c;前思后想、辗转反侧、犹豫再三不知道从哪里开始博客新的篇章&#xff0c;这个问题坦诚说…

【Spark系列3】RDD源码解析实战

本文主要讲 1、什么是RDD 2、RDD是如何从数据中构建 一、什么是RDD&#xff1f; RDD&#xff1a;弹性分布式数据集&#xff0c;Resillient Distributed Dataset的缩写。 个人理解&#xff1a;RDD是一个容错的、并行的数据结构&#xff0c;可以让用户显式的将数据存储到磁盘…

嵌入式Linux系统引导过程中的设备驱动加载

大家好&#xff0c;今天给大家介绍**嵌入式Linux系统引导过程中的设备驱动加载&#xff0c;**文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 **在嵌入式Linux系统的引导过程中&#xff0c…

杨占华主任:冠心病,中医好还是西医好

冠心病是一种慢性疾病&#xff0c;治疗时间相对较长&#xff0c;恢复缓慢。一般来说&#xff0c;冠心病患者也面临着巨大的心理压力。选择中药治疗好还是西药治疗好&#xff1f; 冠心病的西医治疗主要包括药物治疗、冠状动脉支架植入和冠状动脉搭桥术。 中医治疗冠心病的主要方…

Open CASCADE学习|读取STEP文件并显示

STEP文件是基于ISO 10303标准创建的三维模型数据交换文件&#xff0c;也称为产品模型数据交换标准&#xff08;Standard Exchange of Product data model&#xff09;。这种文件格式旨在提供一个不依赖具体系统的中性机制&#xff0c;实现产品数据的交换和共享。 STEP文件是一…

OJ_键盘输入问题

题干 c语言实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> #include<map> using namespace std;int main() {//记录每个字母需要花费多少时间map<char, int> inputTime {{a,1},{b,2},{c,3},{d,1},{e,2},{f,3},{g,1},{h,2…

RK3568平台开发系列讲解(Linux系统篇)中断线程化

🚀返回专栏总目录 文章目录 一、什么是中断线程化二、中断线程化接口函数三、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、什么是中断线程化 在Linux中,中断线程化(Interrupt Thread)是一种处理中断的方式,它允许将中断处理程序执行的部分移动到一个单…

C51 单片机学习(二):定时器与中断系统

参考 51单片机入门教程 1. 定时器 1.1 定时器定义 51 单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成 C51 单片机学习&#xff08;一&#xff09;&#xff1a;基础外设 讲的都是单片机的 IO 口控制的外设 1.2 定时器作用 用于计时系…

Java算法---递归算法基础介绍

目录 一、递归算法 二、递归算法的典型例子 &#xff08;1&#xff09;阶乘 &#xff08;2&#xff09;二分查找 &#xff08;3&#xff09;冒泡排序 &#xff08;4&#xff09;插入排序 一、递归算法 计算机科学中&#xff0c;递归是一种解决计算问题的方法。其中解决方案…

yum指令——Linux的软件包管理器

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 什么是软件包yum指令1.yum 是什么&#xff1f;2.Linux系统&#xff08;Centos&#xff09;的生态 3.yum的相关操作安装卸载yum的相关操作小结 软件源安…

Python判断语句——布尔类型和比较运算符

一、引言 在Python编程语言中&#xff0c;布尔类型和比较运算符是基础而又至关重要的概念。它们是构建逻辑和决策的核心要素&#xff0c;让程序能够理解“真”与“假”、以及各种数量和值之间的关系。理解并掌握这些概念&#xff0c;对于编写高效、准确的代码至关重要。在本文…

OpenHarmony—仅允许在表达式中使用typeof运算符

规则&#xff1a;arkts-no-type-query 级别&#xff1a;错误 ArkTS仅支持在表达式中使用typeof运算符&#xff0c;不允许使用typeof作为类型。 TypeScript let n1 42; let s1 foo; console.log(typeof n1); // number console.log(typeof s1); // string let n2: typeof …

【极数系列】Flink集成DataSource读取集合数据(07)

文章目录 01 引言02 简介概述03 基于集合读取数据3.1 集合创建数据流3.2 迭代器创建数据流3.3 给定对象创建数据流3.4 迭代并行器创建数据流3.5 基于时间间隔创建数据流3.6 自定义数据流 04 源码实战demo4.1 pom.xml依赖4.2 创建集合数据流作业4.3 运行结果日志 01 引言 源码地…