持续更新 typescript+vue3+pinia 跳坑手记

Tuesday , 2022-2-22 17:56

基于vue3的ts生态库学习手记,遇到啥写啥,还在坑里,持续更新中 …

typescript

  • any、unknown、never类型
    unknown与any类似,但unknown的使用范围小一点,大概意思就是:

any:虽然我不知道你是啥,你干啥我也不管

unknown:你都不知道你是啥,啥都不准你干

1
2
3
4
5
6
function f1(a: any) {
a.b(); // OK
}
function f2(a: unknown) {
a.b();//Object is of type 'unknown'.
}

never:属于是所有类型的子类型,可以用于变量在类型收窄中不可能为真的情况,尤雨溪在知乎上的回答很直观:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

interface Foo {
type: 'foo'
}

interface Bar {
type: 'bar'
}

type All = Foo | Bar

function handleValue(val: All) {
switch (val.type) {
case 'foo':
// 这里 val 被收窄为 Foo
break
case 'bar':
// val 在这里是 Bar
break
default:
// val 在这里是 never
const exhaustiveCheck: never = val
break
}
}
1
2
//如果后续的调整改动了All类型
type All = Foo | Bar | Baz

个时候在 default branch 里面 val 会被收窄为 Baz,导致无法赋值给 never,产生一个编译错误。所以通过这个办法,你可以确保 handleValue 总是穷尽 (exhaust) 了所有 All 的可能类型。

链接:https://www.zhihu.com/question/354601204/answer/888551021

  • Promise< T> 泛型的使用
    Promise的泛型T代表promise变成成功态之后resolve的值,resolve(value),这可以用于对axios的请求后的类型限制

vue3

组件ts改造

1
2
//组件的script加入语言标识,setup的语法糖还是比较香,不过目前还是比较适应常规写法
<script lang="ts"></script>
  • data的定义有ref与reactive两种方式
1
2
3
4
5
6
7
8
9
10
11
12
//ref泛型的方式去约束
const refString = ref<string>('ref testing');

//reactive的属性使用断言的方式约束,不过interface的定义最好单独抽出一个文件export出来
interface Post {
title:string
id:number
}
const state = reactive({
post:<Post[]>[{title:'test',id:1}], // <>断言的方式(这种似乎要好看些)
post2:{title:'1',id:1} as Post // as断言的方式
});
  • PropType对props的约束
1
2
3
4
5
6
7
8
9
props:{
post:{
type : Object as PropType<Post>,//此处 Object 并非作为数据类型存在,而是作为构造函数存在,为构造函数指定类型,应用 PropType 这个 API
required:true
}
}

//PropType的导出声明如下
export declare type PropType<T> = PropConstructor<T> | PropConstructor<T>[];

pinia

待写….