关于实际开发中类型定义
来源:2-7 常用的 24 种 TS 数据类型

咩仔
2023-10-07
老师好,在vue实际开发中,我可能会偷懒只给变量基本类型定义,遇到了object、array、function可能就不会进行特别详细的类型定义。
那我们既然要用typescript开发,是不是应该对所有类型,能定义则必须完全定义?否则就会出现有的定义有的不定义这种问题。
比如在vue3.2中,声明一个emit,我可能会这样
const emit = defineEmits(['update:modelValue'])
这种写法我是不是应该避免,尽可能的写成下面这样
const emit = defineEmits<{
(e: 'update:modelValue', targetValue: string): void
}>()
还比如老师您后面函数那章节的例子,Vue3实际开发中是否也推荐每个函数也要完全写好定义呢
let info: (name: string, age: number) => number =
function (name: string, age: number) :number {
console.log("name:", name, " age:", age);
return 3
}
或者
type TypInfoFun = (name: string, age: number) => number
let info: TypInfoFun =
function (name: string, age: number) :number {
console.log("name:", name, " age:", age);
return 3
}
这种类似的问题困扰我很久,希望老师详细说说,谢谢!
1回答
-
(1) 你说的 "是不是应该对所有类型,能定义则必须完全定义" 是正确的,这也是 ts 该具备的能力。
(2)const emit = defineEmits(['update:modelValue']),const emit = defineEmits<{ (e: 'update:modelValue', targetValue: string): void }>() 两个写法都可以, 前者是新写法,你可以看到emit 时有提示。
(3)下面增加 (name: string, age: number) => number 和不加都能有自动提示,问题不在于有没有提示,而是一但你加了 (name: string, age: number) => number,就对 function (name: string, age: number) :number 的类型固化了,而不加可以任意修改。
let info: (name: string, age: number) => number = function (name: string, age: number) :number { console.log("name:", name, " age:", age); return 3 }
一般加上 (name: string, age: number) => number 更好,起到约束函数类型。
00
相似问题