typescript - 验证元组
问题描述
我有一个类型Job
const days = ['Monday', 'Wednesday'] as const
type Day = typeof days[number]
const isValidDay = (value: string): value is Day => value in days
const statuses = ['start', 'end'] as const
type Status = typeof statuses[number]
const isValidStatus = (value: string): value is Status => value in statuses
type Job = [Day, Status]
我想编写一个函数来验证参数是否符合类型Job
鉴于我会像这样使用这个验证器
const main = (value: string) => {
const job = value.split('/')
if (!isValidJob(job)) {
throw new Error('Not a job')
}
// ...
}
我认为isValidJob
应该实施类似
const isValidJob = (value: Array<string>): value is Job => {
return value.length === 2 && isValidDay(value[0]) && isValidStatus(value[1])
}
但是即使这个验证器没有断言value
符合Job
,以下也不会标记任何问题,也value[1]
不会是一个数字
const isValidJob = (value: any): value is Job => {
return typeof value[1] === 'number'
}
所以我的问题是,我应该如何验证job
type Job
?
解决方案
返回类型谓词的函数只需要在运行时返回一个布尔值。这就是它们的工作方式 - 您断言所提供的验证对于该特定类型是正确的。您最初的实现isValidJob
看起来会很好地做到这一点。Array.isArray
如果您想将value
参数键入为any
或,您可以添加一个检查unknown
。
但是,我不认为前面的两个守卫是正确的。in 运算符为对象属性和数组索引返回 true,而不是数组中的元素。例如:
isValidDay("Monday") // false
isValidDay("length") // true
isValidDay(0) // fails TS check but returns true
您可以使用以下方法处理此问题Array.some
:
const isValidDay = (value: string): value is Day => days.some(d => d === value);
推荐阅读
- c# - BitmapSource.CopyPixel:如何只复制感兴趣的区域?
- python - 如何在没有换行符的情况下将文件中的行转换为字符串?
- c# - 左外连接后,Linq 查询返回重复项
- wpf - 将内部 ContentControl 控件绑定到父 ItemsControl 项
- regex - 正则表达式捕获点被数字包围
- reactjs - Angular 7 的生产版本,其中呈现了 React 组件
- r - 按类别对 x 轴进行分组
- regex - 避免提取具有特定术语的单词
- python - 如何从 html 中获取图像,图像不在 img 标签中,而是在 div class='blah blah' 下
- c++ - std::fmod 糟糕的双精度