Vue中TypeScript的常用标注类型(三)computed()、事件处理函数和provide/inject

1,592 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

组件computed()的标注类型

computed()的标注类型的也是可以通过自动计算其的返回值来推导出类型的。

import { ref, computed } from 'vue'

const num = ref(0)

// 推导得到的类型:ComputedRef<number>
const count = computed(() => num.value * 2)

// => TS Error: Property 'split' does not exist on type 'number'
const result = count.value.split('')

当然我们你可以通过泛型参数的形式来指定类型:

const double = computed<number>(() => {
  // 当函数的返回值不是 number 类型则会报错
})

事件处理函数的标注类型

像我们开发中遇到的各种change、click以及input等等事件,我们也应该给其参数标注正确的类型。以input事件为例:

<script setup lang="ts">
const handleInput = (event) => {
  // 当我们没有给参数标注类型时,他会给你个提示
  // TS7044: Parameter 'event' implicitly has an 'any' type, but a better type may be inferred from usage.
  // 意思是,他会隐式的给你标注any类型
  console.log(event.target.value)
}
</script>

<template>
  <input type="text" @input="handleInput" />
</template>

当你在tsconfig.json的文件中配置"strict": true 或 "noImplicitAny": true属性时,他就会提示上述的错误。 所以说,我们可以显示地为其标注参数类型。

const handleInput = (event: Event) => {
  console.log((event.target as HTMLInputElement).value);
}

还有一点需要注意是地,当你需要使用event地属性时,需要给其进行相应地强制转换。就像上面代码中地as HTMLInputElement 一样。

provide 和 inject 的标注类型

provide 和 inject 的标注类型会稍显麻烦一点,因为其涉及到在不同的组件中运行,所以我们就需要通过vue提供的InjectionKey 接口,来进行标注了,它继承自Symbol的泛型类型,也为我们通过Symbol()作为注入名提供了便利。

import { provide, inject } from 'vue'
import type { InjectionKey } from 'vue'

// 使用Symbol()作为注入名,可以很好的避免命名冲突
// 当然更建议把注入名放到一个单独额文件中,可以进行很好的复用
const key = Symbol() as InjectionKey<string>

provide(key, 'title') // 若提供的是非字符串值会导致错误

使用注入值的时候时,因为其的类型是unknown,所以需要泛型参数来显示声明:

// 因为无法保证注入值是否存在,所以类型为string | undefined的联合类型
const title = inject<string>('title') 

当然,如果确定该值始终被注入的时候,也可以进行强制转换:

const title = inject('title') as string