我有一個標準的路由器輸入。
type Routes = '/' | '/achievements' | ... ;
這使您可以了解專案中有哪些路由器。但是現在我的任務是制作一個包含所有路由器的陣列。
const allRoutes: Routes[] = ['/', '/achievements'];
如果缺少任何路由器,它應該會出錯。該陣列必須始終包含所有路由器。怎么做到呢?
我不知道如何要求陣列包含路由器的整個列舉。
更新
我的型別在檔案 d.ts 中描述。所以我不能宣告構造
const ROUTES = ['/', '/achievements'] as const
并將其匯出到那里
uj5u.com熱心網友回復:
你可以這樣做:
const ROUTES = ['/', '/achievements'] as const
type RoutesTuple = typeof ROUTES
type Routes = RoutesTuple[number]
const allRoutes: RoutesTuple = ['/', '/achievements']
uj5u.com熱心網友回復:
您可以使用強制陣列具有聯合型別的每個專案的函式
type Routes = 'a' | 'b' | 'c'
const usedRoutes = ['a', 'b', 'd']
function ensureArrayHasEvery<T>() {
return function <A extends readonly T[]>(a: NoInfer<ArrayWithEvery<A, T>> | A & [never]) {
return a;
}
}
let x = ensureArrayHasEvery<Routes>()
// ^?
let y = x(['a', 'b', "c"])
// ^? ['a']
let z = x(['a'])
// ^? Argument of type '["a"]' is not assignable to parameter of type '["a", "b" | "c"]
type ArrayWithEvery<A extends readonly any[], V> = [V] extends [A[number]] ? A : [...A, Exclude<V, A[number]>]
type NoInfer<A> = [A][A extends any ? 0 : never]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534692.html
