记录 Vue3 + Ts 类型使用

阅读时长: 10 分钟

本文内容:记录在 Vue3 中使用 ts 时的各种写法.

在这里插入图片描述

类型大小写

vue3 + ts 项目中,类型一会儿大写一会儿小写。

怎么区分与基础类型使用? String、string、Number、number、Boolean、boolean …

  • 在 js 中, 以 string 与 String 举例,后者是前者的包装对象,其他类型也一个意思。

  • 在 ts 中,以 string 与 String 举例,前者是 ts 中的类型,后者是 js 中的对象,其他类型也一个意思。

结论:在 ts 中使用小写 定义参数类型(例如:定义 title: string,而不是 title: String )。

<script setup lang="ts">

  interface DialogOptions {
    title: string; // 小写
    visible?: boolean; // 小写
  }

  const props = defineProps<DialogOptions>();
  
</script>

props 类型约束

对于 props 类型进行限制时有 4 种写法:

1.(推荐) 先定义接口,然后使用

缺陷: 无法定义默认值

<script setup lang="ts">
  interface DialogOptions {
    title: string;
    visible?: boolean;
    callback: (row: any) => any;
  }
  const props = defineProps<DialogOptions>();
</script>

2.(不推荐) 直接通过泛型约束类型

缺陷:写起来过于复杂

<script setup lang="ts">
  const props = defineProps<{
    title: string;
    visible?: boolean;
    callback: (row: any) => any;
  }>();
</script>

3.(推荐) 先定义接口,结合 Vue3 框架提供的 withDefaults() 来约束类型

适用于:可定义默认值

<script setup lang="ts">
  interface DialogOptions {
    title?: string;
    visible?: boolean;
    callback: (row: any) => any;
  }

  const props = withDefaults(defineProps<DialogOptions>(), {
    title: "dialog title",
    visible: false,
  });
</script>

4.(不推荐)保持与 vue2 一致的写法。使用 Vue3 框架提供的宏函数 defineProps() 内置的类型推导功能

优点:此写法虽然与 Vue2 中写法一致,但是 type 的值必须使用大写。大小写混用,容易造成认知错误

<script setup lang="ts">
  const props = defineProps({
    title: {
      type: String, // 大写
      default: "Dialog",
      required: true,
    },
    visible: {
      type: Boolean, // 大写
      default: false,
      required: false,
    },
    callback: {
      type: Function, // 大写
      default: () => {},
      required: false,
    },
  });
</script>

4.(......) 使用 validor 验证 props 参数的情况

需要用到 validator 来约束值时,使用此方法,无法分离使用(如果你有好办法,请评论留言)

<script setup lang="ts">
  const props = defineProps({
    title: {
      type: String as PropType<"提示" | "弹窗" | "确认框">,
      default: "提示",
      validator: (prop: string) => ["提示", "弹窗", "确认框"].includes(prop),
    },
    visible: {
      type: Boolean,
      default: false,
      required: false,
    },
    callback: {
      type: Function,
      default: () => {},
      required: false,
    },
  });
</script>

emit 类型约束

  1. 数组用法(无法约束类型)
<script setup lang="ts">
  // 申明
  const emit = defineEmits(["receiveData"]);

  // 使用
  const clickButton = () => {
    emit("receiveData", "456");
  };
</script>
  1. Object 用法 (无法约束类型)
<script setup lang="ts">
  const emit = defineEmits({
    receiveData: (payload) => {
      return typeof payload === "string";
    },
  });

  // 使用
  const clickButton = () => {
    emit("receiveData", 123456);
  };
</script>

ref 类型约束

  1. 通过泛型约束
<script setup lang="ts">
  interface ReceiveData {
    value: number;
  }
  const year = ref<ReceiveData>({ value: 2023 });
  console.log(year.value);
</script>
  1. 通过值约束
<script setup lang="ts">
  interface ReceiveData {
    value: number;
  }
  const year: Ref<ReceiveData> = ref({ value: 2023 });
  console.log(year.value);
</script>

reactive 类型约束

<script setup lang="ts">
  interface ReceiveData {
    value: number;
  }
  // 1. 通过泛型约束
  const year = reactive<ReceiveData>({ value: 2023 });
  console.log(year);

  // 2. 通过值约束
  const year: ReceiveData = reactive({ value: 2023 });
  console.log(year);
</script>

参考阅读

  • types validator issuse#8152

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

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

相关文章

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

Prometheus-各种exporter

一、 nginx-prometheus-exporter 1 nginx 配置 1.1 Nginx 模块支持 nginx 安装的时候需要有 nginx 的状态模块: stub_status 可通过如下命令检查 nginx -V 2>&1 | grep -o with-http_stub_status_module1.2 Nginx 配置文件配置 添加如下配置到自己 nginx 的配置文…

落地数字化管理,提升企业市场竞争力

数字化企业管理方案是一种利用数字技术和信息系统来提升企业管理效率和运营效果的策略。 潜在的数字化企业管理方案 1、企业资源规划&#xff08;ERP&#xff09;系统&#xff1a;建立一个集成的ERP系统来统一管理企业的各项业务流程&#xff0c;包括采购、销售、库存管理、财…

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…

Cpp9 — map和set

map和set STL分为序列式容器&#xff08;vector、list、deque&#xff09;和关联式容器&#xff08;map、set&#xff09; 序列式容器&#xff1a;数据与数据之间没有很强的联系。&#xff08;各个数据之间没什么关联&#xff09;。底层为线性序列的数据结构&#xff0c;里面…

【云原生K8s】二进制部署单master K8s+etcd集群

一、实验设计 mater节点master01192.168.190.10kube-apiserver kube-controller-manager kube-scheduler etcd node节点node01192.168.190.20kubelet kube-proxy docker (容…

elementUI全屏loading的使用(白屏的解决方案)

官网中有使用方法&#xff0c;但是我实际上手之后会出现白屏&#xff0c;解决办法如下&#xff1a; <el-button type"text" size"small" click"delRow(scope)"> 删除</el-button>loading: false, // loading 动画loadingInstance…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了&#xff0c;今天突然使用的时候&#xff0c;发现用不了&#xff0c;报错&#xff1a; Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查&#xff0c;发现…

【NLP概念源和流】 06-编码器-解码器模型(6/20 部分)

一、说明 在机器翻译等任务中,我们必须从一系列输入词映射到一系列输出词。读者必须注意,这与“序列标记”不同,在“序列标记”中,该任务是将序列中的每个单词映射到预定义的类,如词性或命名实体任务。 作者生成 在上面的

基于回溯算法实现八皇后问题

八皇后问题是一个经典的计算机科学问题&#xff0c;它的目标是将8个皇后放置在一个大小为88的棋盘上&#xff0c;使得每个皇后都不会攻击到其他的皇后。皇后可以攻击同一行、同一列和同一对角线上的棋子。 一、八皇后问题介绍 八皇后问题最早由国际西洋棋大师马克斯贝瑟尔在18…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

7_分类算法—逻辑回归

文章目录 逻辑回归&#xff1a;1 Logistic回归&#xff08;二分类问题&#xff09;1.1 sigmoid函数1.2 Logistic回归及似然函数&#xff08;求解&#xff09;1.3 θ参数求解1.4 Logistic回归损失函数1.5 LogisticRegression总结 2 Softmax回归&#xff08;多分类问题&#xff0…

Nginx安装和Nginx配置虚拟主机

Nginx安装 源码包获取地址&#xff1a;http://nginx.org/download/ RPM包获取地址&#xff1a;http://nginx.org/packages/centos/7Server/x86_64/RPMS/ RPM安装 这里选择的RPM包是 nginx-1.22.0-1.el7.ngx.x86_64.rpm [rootlocalhost ~]# yum install nginx-1.22.0-1.el7.…

【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…

深度学习论文: Towards Total Recall in Industrial Anomaly Detection及其PyTorch实现

深度学习论文: Towards Total Recall in Industrial Anomaly Detection及其PyTorch实现 Towards Total Recall in Industrial Anomaly Detection PDF: https://arxiv.org/pdf/2106.08265.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://…

2.4G芯片XL2408开发板,SOP16封装,芯片集成1T 8051内核单片机

XL2408开发板可用于2.4G芯片XL2408开发板的开发调试。XL2408烧录仿真需要使用WS_LINK。XL2408开发板烧录仿真需要接4根线&#xff1a;PA13:DIO&#xff0c;PA14:CLK&#xff0c;VCC&#xff0c;GND。 XL2408芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,…

CentOS 7.6使用yum安装stress,源码安装stree-ng 0.15.06,源码安装sysstat 12.7.2

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 yum install stress sysstat -y安装stress和sysstat。 使用pidstat -u 5 1没有%wait项&#xff1a; 原因是CentOS 7仓…

1分钟解决github push/pull报错443

1.打开https://www.ipaddress.com/ 2.复制如图IP地址 3.文件夹打开C:\Windows\System32\drivers\etc&#xff0c;复制hosts文件&#xff0c;粘贴到桌面 4.在桌面用记事本打开复制过来的hosts 5.在末尾加上一行&#xff0c;IP写刚才复制的 6.复制桌面的hosts,粘贴回C:\Window…

剑指offer48.最长不含重复字符的子字符串

我一开始的想法是创建一个大小为26的int数组&#xff0c;下标为0对应的是‘a&#xff0c;25对应的是’z&#xff0c;然后一开始都赋为-1&#xff0c;用一个for循环从头遍历这个字符串&#xff0c;通过char c s.charAt(i)获得字符&#xff0c;然后c-97&#xff0c;就是它对应的…

windows系统之WSL 安装 Ubuntu

WSL windows10 以上才有这个wsl功能 WSL&#xff1a; windows Subsystem for Linux 是应用于Windows系统之上的Linux子系统 作用很简单&#xff0c;可以在Windows系统中获取Linux系统环境&#xff0c;并完全直连计算机硬件&#xff0c;无需要通过虚拟机虚拟硬件 Windows10的W…