typescript 有没有一种方法可以在不创建特定类型的情况下将Assert函数用于复杂的验证?

ztmd8pv5  于 2022-12-19  发布在  TypeScript
关注(0)|答案(1)|浏览(96)

我正在从API接收数据,我想在前端添加一些验证,并在验证后获得正确的类型,但实际上是特定的类型。例如,假设我获得{ keyA?: { property?: string | null | undefined }, keyB?: string | null } | null类型的data,我想确保property是非空字符串,而keyB可以为空(只是为了说明我不想验证每个字段,因为它不是常见的NonNull~ case)有没有办法在另一个函数作用域(接收此数据)中进行验证,而无需手动创建类型?
我试着创建一个函数:

function assertData(data: DType): asserts data {
  if(!data) throw new Error('no data')
  if(!data.keyA) throw new Error('keyA undefined');
  if(!data.keyA.property) throw new Error('property undefined');

调用函数后,我可以使用数据(非空值),但keyA可以是undefined。我希望能够使用data.keyA.property没有问题,并已键入为字符串。

qhhrdooz

qhhrdooz1#

您可以将函数修改为具有以下签名:

function assertData(data: DType): asserts data is DType & { 
  keyA: { property: string } 
} {
  if(!data) throw new Error('no data')
  if(!data.keyA) throw new Error('keyA undefined');
  if(!data.keyA.property) throw new Error('property undefined')
}

我们AssertdataDType,但keyAkeyA.property不是未定义的。

declare const a: DType
assertData(a)
a.keyA.property.charAt(0)

Playground

相关问题