当我们写页面的时候,定义一个页面状态的数组,我们可能是如下写法:
const pageStatus = [0,1,2] //0123具体代表什么,自己根据项目组情况而定 或者写成 ['loading','success','error'] 随便什么,只要你喜欢
这是js写法,那如果我们项目引入了 ts 呢?那他可能就会变成
type PageStatusProps = 0 | 1 | 2 //或者 'loading' | 'success' | 'error'
const pageStatus: PageStatusProps[] = [0, 1, 2] //['loading', 'success', 'error']
再来个类似的,定义一个你喜欢的动物列表
type Animal = 'cat'| 'duck' | 'rabbit'
const animals = ['cat', 'duck', 'rabbit']
细心的你可能发现,type('cat'| 'duck' | 'rabbit') 和 最终的数组(['cat', 'duck', 'rabbit']),里面单个值,重复写了。那么意味着:我们要维护两个地方的代码..
那么如何优雅解决这个问题呢?
export type Lit = string | number //可以更多,但是感觉不是特别有用
export const tuple = <T extends List[]>(...args: T) => args
//example1
const animals = tuple('cat','duck','rabbit');
type Animal = typeof animals[number]; //联合类型,'cat' | 'duck' | 'rabbit'
//example2
const pageStatus = tuple(0,1,2)
type PageStatusProps = typeof pageStatus[number] //0,1,2
如果聪明的你有更好的方法,跪求告知。