我有一个实体,它可以在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
。
游乐场(示例用法(