有没有方法代表函数来过滤Typescript上具有非null属性的对象



我有一个实体,它可以在UI上创建,也可以由数据库发送

interface Task {
id?: number | null,
description: string,
}

若实体来自数据库,则id必须存在

type DatabaseRecord<T extends {id: number | null | undefined}> = Omit<T, 'id'> & {id: number}

所以现在我需要一个过滤函数,它可以帮助我从数据库中确定对象,所以我尝试了这个变体,但它不起作用:

export function isInputFromDatabase<T>(input: null | undefined | T): input is DatabaseRecord<T> {
return input !== null && input !== undefined && !!input.id;
}
...
source$: Observable<Task | null> = store.currenTask$
...
source$.pipe(filter(inputFromDatabase)).subscribe((task) => doSmthWithId(task.id))

那么,有没有办法过滤不为null/未定义id的实体呢?

您可以将T{ id: number }:相交

function isInputFromDatabase<T extends { id?: number | null | undefined }>(input: null | undefined | T): input is T & { id: number } {
return input !== null && input !== undefined && !!input.id;
}

此外,还需要对T进行通用约束,以便可以使用input.id

游乐场(示例用法(