假设我们已有一个数组如下:

const typeArr = ['text', 'image', 'video', 'audio']

这时候,我们在其他地方定义了一个值,这个值只能取typeArr里面的值,在ts里面我们如何去定义这个的类型呢,先上代码:

const typeArr = ['text', 'image', 'video', 'audio'] as const
type AllType = typeof typeArr[number]

怎么理解呢?

在ts中,我们知道as 这个是代表强制定义,一个类型强制为另一个类型,这时候我们使用as const 就把 typeArr[0]的取值对象由string变成了唯一值: text, 其他同理。

而我们知道,数组其实是一个对象,只不过带了一堆带数字的下标,如:typeArr[0]/typeArr[1]等,由于我们上面告诉了ts,typeArr[0]只能取唯一值:text,这时候通过typeof typeArr[number]类型推导,我们就能得出,第一个值是text, 其他同理。

这样我们就得出了AllType 这个类型,他的值为:”text” | “image” | “video” | “audio”。

然后我们就可以在其他地方愉快地使用这个类型了,并且,它还会随着typeArr的变化而变化。