我正在尝试验证我的应用程序收到的数据。一个简短的例子如下:
function getField(data:unknown):string {
if (typeof data !== 'object') {
throw new Error('e1');
}
if (data == null) {
throw new Error('e2');
}
const { field } = data;
if (typeof field !== 'string') {
throw new Error('e3');
}
return field;
}
Run Code Online (Sandbox Code Playgroud)
我需要从数据中提取字符串字段。如果数据的形状无效,代码应该抛出异常。问题是,上面的代码没有进行类型检查。它失败并显示“类型‘{}’上不存在属性‘字段’。”。我知道我可以添加一些any并且它会起作用,但我试图any以类型安全的方式在没有 的情况下执行此操作。
Tit*_*mir 13
有人建议允许in类型保护来评估属性的存在,但它没有实现(GH)
您可以使用足够安全的类型断言 ( const { field } = data as { field: unknown };),也可以使用自定义类型保护来检查属性是否存在:
function hasProp<K extends PropertyKey>(data: object, prop: K): data is Record<K, unknown> {
return prop in data;
}
function getField(data: unknown): string {
if (typeof data !== 'object') {
throw new Error('e1');
}
if (data == null) {
throw new Error('e2');
}
if (!hasProp(data, 'field')) {
throw new Error('field does not exist');
}
const { field } = data;
if (typeof field !== 'string') {
throw new Error('e3');
}
return field;
}
Run Code Online (Sandbox Code Playgroud)
注意由于您要抛出异常,因此您可以使用新的断言语法:Playground Link
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |