gpt4 book ai didi

typescript - 将 `unknown` 缩小到具有字符串字段的对象,而不使用 `any`

转载 作者:行者123 更新时间:2023-12-03 23:10:06 24 4
gpt4 key购买 nike

我正在尝试验证我的应用程序收到的数据。一个简短的例子如下:

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;
}

我需要从数据中提取一个字符串字段。如果数据的形状无效,代码应该抛出。问题是,上面的代码没有类型检查。它失败并显示“类型 '{}' 上不存在属性 'field'。”。我知道我可以添加一些 any它会起作用,但我正在尝试在没有 any 的情况下执行此操作,以类型安全的方式。

最佳答案

有建议允许in类型保护 Assets 存在的属性,但它没有实现( 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;
}

Playground Link

备注 由于您正在抛出异常,您可以使用新的断言语法: Playground Link

关于typescript - 将 `unknown` 缩小到具有字符串字段的对象,而不使用 `any`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59033604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com