Vue中使用Typescript及Typescript基础

news2024/11/15 10:55:05

准备工作

新建一个基于ts的vue项目

通过官方脚手架构建安装

# 1. 如果没有安装 Vue CLI 就先安装
npm install --global @vue/cli

最新的Vue CLI工具允许开发者 使用 TypeScript 集成环境 创建新项目。
只需运行vue create my-app 然后选择选项,箭头键选择 Manually select features,确保选择了 TypeScript 和 Babel 选项
在这里插入图片描述

在已存在项目中安装typescript

在建好的vue项目中执行

vue add @vue/typescript

在这里插入图片描述
和之前js构建的项目结构没有什么不同,主要是js后缀变成了ts后缀,还多了tsconfig.jsonshims-tsx.d.tsshims-vue.d.ts这几个文件,这几个文件的主要功能如下:
tsconfig.json: typescript配置文件,主要用于指定待编译的文件和定义编译选项
shims-tsx.d.ts: 允许.tsx 结尾的文件,在 Vue 项目中编写 jsx 代码
shims-vue.d.ts: 主要用于 TypeScript 识别.vue 文件,Ts 默认并不支持导入 vue 文件

TS特点

  • 类型注解、类型检测
  • 接口
  • 泛类
  • 装饰器
  • 类型声明

类型注解和编译时类型检查

使用类型注解约束变量类型,编译器可以做静态类型检查,使程序更加健壮

类型基础
// 类型注解
let var1: string;

var1 = 'Jenney'
// var1 = 1 // no ok

// 类型推断
let var2 = true;
// var2 = 1 // no ok

// 常见原始类型: string,number,boolean,undefined,null,symbol

// 类型数组
let arr: string[]
arr = ['tom', 'jerry']

// 任意类型any
let varAny: any;
varAny = 'tom'
varAny = 1

let arrAny: any[]
arrAny = [1, true, 'free']

// 函数中类型约束
//(第一个string代表参数必须有且是string类型,第二个string代表返回值必须有且是string类型)
function greet(person: string): string {
  return 'hello, ' + person
}
const ret = greet('tom')

// void类型,常用于没有返回值的函数
 function warn(): void {}
类型别名 type

使用类型别名自定义类型,以达到类型复用

// let Foobar1 : { foo: string, bar: number }
// let objType1 = {
//   foo: 'fooo',
//   bar: 1
// }
//以上方法类型无法复用
// 使用type定义类型别名,使用更便捷,还能复用
type Foobar = { foo: string, bar: number }
let objType: Foobar
objType = {
  foo: 'fooo',
  bar: 1
}

范例:

//1.使用类型别名定义Feature,types/index.ts
export type Feature = {
  id: number,
  name: string
}

//2.使用自定义类型,HelloWorld.vue
<template>
  <div class="hello">
    <li>
      {{features.name}}
      <!-- <li v-for="item in features" :key="item.id">{{item.name}}</li> -->
    </li>
  </div>

</template>

<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
// 导入
import { Feature } from '@/types';

@Component
export default class HelloWorld extends Vue {
  @Prop() private msg!: string;
  features: Feature = {id:1,name:'类型注解'}
}
</script>
<style scoped>
</style>
接口 interface(和接口别名的功能一致)
interface Barfoo {
  foo: string;
  bar: number;
}

类型别名和接口区别:
type vs interface 官方文档
总结:
在大部分情况下完全可以互换
1.大部分的区别是IDE(代码提示)的影响,对程序本身不影响
2.在2.7版本前不支持类型别名,在通用性来讲接口更好点,
(1)如果要写通用的库,建议用接口
(2)但是在使用别名的时候语义的感觉和描述更强一些,所以如果是简单的功能用别名更好一下

联合类型 |

希望某个变量或参数的类型是多种类型其中之一

let union: string | number;
union = '1'; // ok
union = 1; // ok
交叉类型 &

并集
想要定义某种由多种类型合并而成的类型使用交叉类型

type First = {first: number};
type Second = {second: number};
// FirstAndSecond将同时拥有属性first和second 
type FirstAndSecond = First & Second;
函数
//必填参:参数一旦声明,就要求传递,且类型需符合
function greeting(person: string): string {
  return "Hello, " + person;
}
greeting('tom')

//可选参数:参数名后面加上问号,变成可选参数
function greeting(person: string, msg?: string): string {
  return "Hello, " + person;
}

//默认值
function greeting(person: string, msg = ''): string {
  return "Hello, " + person;
}

//函数重载

// 重载1
function watch(cb1: () => void): void;
// 重载2
function watch(cb1: () => void, cb2: (v1: any, v2: any) => void): void; // 实现
function watch(cb1: () => void, cb2?: (v1: any, v2: any) => void) {
	if (cb1 && cb2) {
		console.log('执行watch重载2');
	} else { 
		console.log('执行watch重载1');
	}
 }

ts中的类和es6中大体相同,这里重点关注ts带来的访问控制等特性

// 03-class.ts
class Parent {
	// 私有属性,不能在类的外部访问 
	private _foo = "foo"; 
	 // 保护属性,可以在子类中访问
	protected bar = "bar";
	// 参数属性:构造函数参数加修饰符,能够定义为成员属性 
	constructor(public tua = "tua") {}
	// 方法也有修饰符
	private someMethod() {}
	// 存取器:属性方式访问,可添加额外逻辑,控制读写性 
	get foo() {
	   return this._foo;
	}
	set foo(val) {
	    this._foo = val;
	}
}

范例:利用getter设置计算属性,Hello.vue

<template> 
		<li>特性数量:{{count}}</li>
</template>
<script lang="ts">
export default class HelloWorld extends Vue { // 定义getter作为计算属性
	get count() {
     	return this.features.length;
    }
}
</script>
泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。以此增加代码通用性
具体看文档,此处简单说下

interface Result {
 	ok:0|1;
   data: Feature[];
}
// 以上写法不通用
// T成了通用的,可以动态的指定类型,可以让程序的类型变的更加通用
interface Result<T> {
  ok: 0 | 1;
  data: T[];
}

//泛型方法
function getResult<T>(data: T): Result<T> {
   return {ok:1, data};
}

getResult<string>()

泛型优点

  • 函数和类可以支持多种类型,更加通用
  • 不必编写多条重载,冗长联合类型,可读性好
  • 灵活控制类型约束

不仅通用且能灵活控制,泛型被广泛用于通用库的编写。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产芯片架构再下一城,ARM或被彻底抛弃,外媒:自作自受

有消息指出特定厂商的5G手机芯片将采用RISC-V架构&#xff0c;这是国产芯片彻底抛弃ARM的标志&#xff0c;毕竟ARM如今对中国芯片越来越不友好&#xff0c;最新款的ARM V9架构就未对多家中国芯片企业授权&#xff0c;抛弃ARM在情理之中。 据悉特定企业的5G手机芯片为RISC-V架构…

Vue项目中强制刷新页面的方法

我们在动态切换组件的过程中&#xff0c;导航栏和底栏不动&#xff0c;动态切换中间区域的情况&#xff0c;在首页可以进行跳转任意组件&#xff0c;在组件与组件之间不能相互跳转&#xff0c;路由发生了变化&#xff0c;但是页面未改变&#xff0c;这时我们就需要强制刷新页面…

窗口透明丨窗口透明度设置控件透明以及窗体透明源码

透明窗口&#xff08;窗口上面文字图片等内容不透明&#xff09;的实现&#xff08;使用SetLayeredWindowAttributes API函数&#xff09; SetLayeredWindowAttributes的实现必须将窗口设置为WS_EX_LAYERED的扩展风格。 然而&#xff0c;只有WS_POPUP窗口才能设置WS_EX_LAYER…

SG函数Nim游戏博弈论

移棋子游戏 题目 https://vjudge.csgrandeur.cn/problem/LibreOJ-10243 给定一个有 N 个节点的有向无环图&#xff0c;图中某些节点上有棋子&#xff0c;两名玩家交替移动棋子。 玩家每一步可将任意一颗棋子沿一条有向边移动到另一个点&#xff0c;无法移动者输掉游戏。 对…

中国撤销3000亿订单,美芯质问还能卖给谁?Intel或暂停工厂

过去两年多来&#xff0c;美国芯片行业的收入大幅减少&#xff0c;然而这还不是低点&#xff0c;近期传出中国或撤销3200亿美元的芯片订单&#xff0c;这更是让美国芯片行业震惊&#xff0c;美芯巨头因此质问美国芯片卖给谁&#xff1f; 中国这几年一直都在稳步减少芯片进口&am…

PHP高校二手物品交易系统【纯干货分享,免费领源码04827】

目 录 摘要 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 高校二手物品交易系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章…

Java开发基础系列(十四):集合对象(Map)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(十三)&#xff1a;集合对象(Map) ⏱️ 创作时间&…

zlog日志库的使用

代码仓库&#xff1a;https://github.com/HardySimpson/zlog1、zlog 库的默认安装位置是 /usr/local/lib&#xff0c;头文件的安装位置是 /usr/local/include&#xff1b;若需要更改安裝位置&#xff0c;可以修改src/makefile文件下第50行的PREFIX&#xff1f; /usr/local 改为…

当Dubbo遇到高并发:探究流量控制解决方案

系列文章目录 面试Dubbo &#xff0c;却问我和Springcloud有什么区别&#xff1f; 超简单&#xff0c;手把手教你搭建Dubbo工程&#xff08;内附源码&#xff09; 【收藏向】从用法到源码&#xff0c;一篇文章让你精通Dubbo的SPI机制 Dubbo最核心功能——服务暴露的配置、使用…

Doris注意事项,Doris部署在阿里云,写不进去数据

1.Doris官网 Doris官网https://doris.apache.org/ 2.根本原因 本地idea访问FE&#xff0c;FE会返回BE的地址&#xff0c;但是在服务器上通过ip addr查看&#xff0c;发现只有局域网IP&#xff0c;所以FE返回了局域网的IP&#xff0c;导致idea连接不上BE 3.解决办法 重写Ba…

leetcode刷题常用代码片段

Vscode是常用的开发工具&#xff0c;代码插入能够把常见的代码嵌入智能提醒&#xff0c;减轻了很大的工作量&#xff0c;下面是我刷题的配置&#xff0c;直接复制黏贴到自己的cpp.json里就可以用了 左下角&#xff0c;打开设置&#xff0c;选择用户代码片段&#xff0c;选择自…

智慧农业:科技赋能农村发展

智慧农业发展前景灿烂多彩&#xff0c;正为农业带来新的转型升级。随着科技的不断发展&#xff0c;数字化、自动化和智能化技术逐渐渗透进农业领域&#xff0c;为农民提供了更多高效便捷的农业管理方式。智慧农业通过物联网、大数据、人工智能等先进技术&#xff0c;实现对农田…

如何跳出Java中的多层嵌套循环?

在Java中&#xff0c;要跳出多层嵌套循环&#xff0c;可以使用带有标签的break语句。通过在外层循环前加上一个标签&#xff0c;然后在内层循环中使用break语句后跟标签名称&#xff0c;可以实现跳出多层循环的目的。 以下是使用标签和break语句跳出多层嵌套循环的示例代码&…

为 Google Play 即将推出基于区块链的内容政策做好准备

作者 / Joseph Mills, Group Product Manager, Google Play 作为一个平台&#xff0c;Google Play 一直致力于帮助开发者将创新理念变为现实。Google Play 上托管了许多和区块链相关的应用&#xff0c;我们深知合作伙伴们希望扩展这些应用&#xff0c;并利用 NFT 等代币化数字资…

学习笔记|大模型优质Prompt开发与应用课(二)|第五节:只需3步,优质Prompt秒变应用软件

原作者&#xff1a;依依│百度飞桨产品经理 一乔│飞桨开发者技术专家 分享内容 01:大模型应用简介 02:LLM应用开发范式 03: Al Studio大模型社区 04:AI对话类应用开发技巧 大模型技术爆发&#xff0c;各类应用产品涌现 文心产业级知识增强大模型 工作中的“超级助手”—…

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

Educational Codeforces Round 152 (Rated for Div. 2) B. Monsters

很早想到%K排序,但是就是WA2,心态崩了,昨天晚上差点睡不着觉吐了,感觉自己好笨啊啊啊, 言归正传, 按照正常的思路,样例是可以过的,但是AC不了,例如给出样例3 3 3 1 2 经过自己模拟应该输出1 3 2 ,但是只会输出1 2 3 ,知道症结所在debug,0的先输出,之后输出k-1,k-2…但是怎么实现…

接口自动化测试-Python自动发送测试报告邮件封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 SMTP&#xff08;…

vue新学习 02 vue命令v-model,数据代理,事件,监听,渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

亿万富翁Tim Draper:比特币将改变货币与商业的运作方式

点击视频可观看完整版 编译/编辑&#xff1a;秦晋 Draper Associates 创始人、亿万富翁Tim Draper最近接受FOX商业频道「克拉曼倒计时」采访时表示&#xff0c;尽管最近有所下跌&#xff0c;但比特币一直在不断增强持久力&#xff0c;他表示该资产与其他加密货币有所不同。 在T…