确保intervals 必须可分配给Array<Intervals> 很容易:
const intervalsMisspelled: Array<Intervals> =
['weekly', 'biweekly', 'annually', 'monthly', 'totul']; // error, "totul"
但这并不妨碍你忽略一些事情:
const intervalsMissing: Array<Intervals> =
['weekly', 'biweekly', 'annually', 'monthly']; // oops, no error but missing "total"
要解决这个问题,您可以创建一个名为 ensureArray() 的辅助函数,该函数接受一个类型参数 T(对您来说将是 Intervals),然后返回一个新函数,该函数接受一个类型为 @ 的参数列表987654329@ 并为该列表推断数组类型A。如果 A 数组 (A[number]) 的元素的类型比 T 窄,那么您一定遗漏了一些内容,您应该得到一个错误。这是一种方法:
const ensureArray = <T>() => <A extends T[]>(
...a: A & ([T] extends [A[number]] ? A : never)
): A => a;
const ensureIntervalsArray = ensureArray<Intervals>();
const intervals = ensureIntervalsArray(
'annually', 'biweekly', 'monthly', 'total', 'weekly'); // okay
const intervalsMisspelled = ensureIntervalsArray(
'annually', 'biweekly', 'monthly', 'totul', 'weekly'); // error, "totul"
const intervalsMissing = ensureIntervalsArray(
'annually', 'biweekly', 'monthly', 'weekly'); // error,
// [string, string, string, string] is not assignable to never
这可行,尽管您在intervalsMissing 上遇到的错误相当神秘,说某些东西不能分配给never,但没有告诉您问题到底是什么。由于 TypeScript 目前不允许我们创建 custom type errors,我们只能尝试解决这个问题。
下面给出了一个更奇怪的错误信息,但它给了开发者一个提示:
const ensureArray = <T>() => <A extends T[]>(
...a: A & ([T] extends [A[number]] ? A :
{ errorMessage: [Error, "You are missing", Exclude<T, A[number]>] })
): A => a;
const ensureIntervalsArray = ensureArray<Intervals>();
const intervalsMissing = ensureIntervalsArray(
'annually', 'biweekly', 'monthly', 'weekly'); // error,
// Property 'errorMessage' is missing in type
// '["annually", "biweekly", "monthly", "weekly"]'
// but required in type '{ errorMessage: [Error, "You are missing", "total"]; }'
希望其中之一足以满足您的需求。祝你好运!