文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue3中Typescript的基本使用方法有哪些

2023-06-27 10:23

关注

这篇文章主要介绍“Vue3中Typescript的基本使用方法有哪些”,在日常操作中,相信很多人在Vue3中Typescript的基本使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3中Typescript的基本使用方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

变量申明

基本类型

let isDone: boolean = falselet num: number = 1let str: string = 'vue3js.cn'let arr: number[] = [1, 2, 3] let arr2: Array<number> = [1, 2, 3] // 泛型数组let obj: Object = {}let u: undefined = undefined;let n: null = null;

类型补充

使用枚举类型可以为一组数值赋予友好的名字

enum LogLevel {  info = 'info',  warn = 'warn',  error = 'error',}

允许数组各元素的类型不必相同。比如,你可以定义一对值分别为 string和number类型的元组

// Declare a tuple typelet x: [string, number];// Initialize itx = ['hello', 10]; // OK// Initialize it incorrectlyx = [10, 'hello']; // Error

表示任意类型,通常用于不确定内容的类型,比如来自用户输入或第三方代码库

let notSure: any = 4;notSure = "maybe a string instead";notSure = false; // okay, definitely a boolean

与 any 相反,通常用于函数,表示没有返回值

function warnUser(): void {    console.log("This is my warning message");}

类型契约,跟我们平常调服务端接口要先定义字段一个理

如下例子 point 跟 Point 类型必须一致,多一个少一个也是不被允许的

interface Point {    x: number    y: number    z?: number    readonly l: number}const point: Point = { x: 10, y: 20, z: 30, l: 40 }const point2: Point = { x: '10', y: 20, z: 30, l: 40 } // Error const point3: Point = { x: 10, y: 20, z: 30 } // Error const point4: Point = { x: 10, y: 20, z: 30, l: 40, m: 50 } // Error

可选与只读 ? 表示可选参, readonly 表示只读

const point5: Point = { x: 10, y: 20, l: 40 } // 正常point5.l = 50 // error

函数参数类型与返回值类型

function sum(a: number, b: number): number {    return a + b}

配合 interface 使用

interface Point {    x: number    y: number}function sum({ x,  y}: Point): number {    return x + y}sum({x:1, y:2}) // 3

泛型

泛型的意义在于函数的重用性,设计原则希望组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型

根据业务最初的设计函数 identity 入参为String

function identity(arg: String){ return arg}console.log(identity('100'))

业务迭代过程参数需要支持 Number

function identity(arg: String){ return arg}console.log(identity(100)) // Argument of type '100' is not assignable to parameter of type 'String'.

为什么不用any呢?

使用 any 会丢失掉一些信息,我们无法确定返回值是什么类型泛型可以保证入参跟返回值是相同类型的,它是一种特殊的变量,只用于表示类型而不是值

语法 <T>(arg:T):T 其中T为自定义变量

const hello : string = "Hello vue!"function say<T>(arg: T): T {    return arg;}console.log(say(hello)) // Hello vue!

泛型约束

我们使用同样的例子,加了一个console,但是很不幸运,报错了,因为泛型无法保证每种类型都有.length 属性

const hello : string = "Hello vue!"function say<T>(arg: T): T { console.log(arg.length) // Property 'length' does not exist on type 'T'.    return arg;}console.log(say(hello)) // Hello vue!

从这里我们也又看出来一个跟any不同的地方,如果我们想要在约束层面上就结束战斗,我们需要定义一个接口来描述约束条件

interface Lengthwise {    length: number;}function say<T extends Lengthwise>(arg: T): T { console.log(arg.length)    return arg;}console.log(say(1))  // Argument of type '1' is not assignable to parameter of type 'Lengthwise'.console.log(say({value: 'hello vue!', length: 10})) // { value: 'hello vue!', length: 10 }

交叉类型

交叉类型(Intersection Types),将多个类型合并为一个类型

interface foo {    x: number}interface bar {    b: number}type intersection = foo & barconst result: intersection = {    x: 10,    b: 20}const result1: intersection = {    x: 10}  // error

联合类型

交叉类型(Union Types),表示一个值可以是几种类型之一。我们用竖线 | 分隔每个类型,所以 number | string | boolean表示一个值可以是 number, string,或 boolean

type arg = string | number | booleanconst foo = (arg: arg):any =>{     console.log(arg)}foo(1)foo('2')foo(true)

函数重载

函数重载(Function Overloading), 允许创建数项名称相同但输入输出类型或个数不同的子程序,可以简单理解为一个函数可以执行多项任务的能力

例我们有一个add函数,它可以接收string类型的参数进行拼接,也可以接收number类型的参数进行相加

function add (arg1: string, arg2: string): stringfunction add (arg1: number, arg2: number): number// 实现function add <T,U>(arg1: T, arg2: U) {  // 在实现上我们要注意严格判断两个参数的类型是否相等,而不能简单的写一个 arg1 + arg2  if (typeof arg1 === 'string' && typeof arg2 === 'string') {    return arg1 + arg2  } else if (typeof arg1 === 'number' && typeof arg2 === 'number') {    return arg1 + arg2  }}add(1, 2) // 3add('1','2') //'12'

总结

通过本篇文章,相信大家对Typescript不会再感到陌生了

下面我们来看看在Vue源码Typescript是如何书写的,这里我们以defineComponent函数为例,大家可以通过这个实例,再结合文章的内容,去理解,加深Typescript的认识

// overload 1: direct setup functionexport function defineComponent<Props, RawBindings = object>(  setup: (    props: Readonly<Props>,    ctx: SetupContext  ) => RawBindings | RenderFunction): {  new (): ComponentPublicInstance<    Props,    RawBindings,    {},    {},    {},    // public props    VNodeProps & Props  >} & FunctionalComponent<Props>// defineComponent一共有四个重载,这里省略三个// implementation, close to no-opexport function defineComponent(options: unknown) {  return isFunction(options) ? { setup: options } : options}

到此,关于“Vue3中Typescript的基本使用方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯