与Generic一起使用时,自定义AtLeastOne类型未按预期编译



我定义了一个自定义类型AtLeastOne,它确保传入的对象至少包含一个有效的键。当泛型被实例化时,这很好,但当另一个泛型类型被传递到它时,它需要强制转换。我不明白为什么需要这种强制转换。

打字游戏场链接

// based off of https://stackoverflow.com/a/48244432/14905094
type AtLeastOne<T, U = { [K in keyof T]: Pick<Required<T>, K> }> = Partial<T> & U[keyof U];
type DbMetaData = {
id?: number;
};
const correctlyWorks: AtLeastOne<DbMetaData> = { id: 123 };
const correctlyFails: AtLeastOne<DbMetaData> = {};
const genericsExample = <T extends DbMetaData>() => {
// why does this not work?
const doesNotWork: AtLeastOne<T> = { id: 123 };
// can clear the error by using an "as"
const requiresAsAssertion: AtLeastOne<T> = { id: 123 } as AtLeastOne<T>;
};

生成以下错误:

Type '{ id: 123; }' is not assignable to type 'AtLeastOne<T, { [K in keyof T]: Pick<Required<T>, K>; }>'.
Type '{ id: 123; }' is not assignable to type 'Partial<T>'

您的泛型约束表示T扩展了DbMetaData。因此,例如,{}将满足该约束,但const correctlyWorks: AtLeastOne<{}> = { id: 123 };将是一个错误。

换句话说,TS显示错误,因为T的某些值的AtLeastOne<T>与所分配的值不兼容。

最新更新