场景:我正在尝试创建一个基础方法,以便我可以重复使用(
works
/doesNotWork
)它来进行几个不同的调用。由于我不想重复多次设置,所以这个基础方法应该做一些设置。问题是,我传递给我的设置调用的泛型告诉我它期望不同的类型。我需要的所有属性都存在于基础泛型类型中,但是我遇到了 TypeScript 的问题。
错误:类型“{ SyncCount: number; }”的参数不能赋值给类型“DeepPartial<T>”的参数
目标:我希望使用泛型找到一种解决方案,允许我调用一个基础方法进行设置。理想情况下,doesNotWork
会被修改以正常工作。请参见下面的示例代码和 fiddle 中的期望代码(目标)。
这是我在issue中的代码片段。
type DeepPartial<T> = T extends object ? {
[P in keyof T]?: DeepPartial<T[P]>;
} : T;
interface IDbRecord {
readonly _id: string;
readonly _rev: string;
readonly DocumentType: string;
}
interface IBuilder<TEntity extends IDbRecord> {
defaults(value: DeepPartial<TEntity>): Builder<TEntity>
}
class Builder<TEntity extends IDbRecord> implements IBuilder<TEntity> {
defaults(value: DeepPartial<TEntity>): IBuilder<TEntity> {
return this;
}
}
interface IBaseEntity extends IDbRecord {
SyncCount: number;
SyncStatus: string
}
interface ICar extends IBaseEntity {
Model: string;
}
interface IPerson extends IBaseEntity {
Name: string
}
class Test {
protected builder<TEntity extends IDbRecord>() {
return new Builder<TEntity>();
}
private works<T extends IBaseEntity>() {
// not using the generic type works
return this.builder<IBaseEntity>().defaults({ SyncCount: 0 })
}
private doesNotWork<T extends IBaseEntity>() {
// using the generic type does not work here
return this.builder<T>().defaults({ SyncCount: 0 }) // ERROR
}
private someWorkingImplmentation<T extends IBaseEntity>() {
return this.builder<T>().defaults({ SyncCount: 0 });
}
// I want to avoid duplicate code below from defaults.
// A base setup method would be best
people = this.builder<IPerson>().defaults({ SyncCount: 0 });
cars = this.builder<ICar>().defaults({ SyncCount: 0 });
// GOAL
_people = this.someWorkingImplmentation<IPerson>();
_cars = this.someWorkingImplmentation<ICar>();
}
return this.builder<T>().defaults({ SyncCount: 0 } as DeepPartial<T>)
来解决它。 - tom10271