typescript - 复杂的泛型类型约束和类型推断
问题描述
我正在尝试在 TypeScript 中构建一个微型 ORM,但我遇到了这个编译问题:
Type 'TObject' does not satisfy the constraint '{ [k in k]: object; }'.
Type 'object' is not assignable to type '{ [k in k]: object; }'.
有谁知道为什么这个代码示例会引发编译错误?以及如何解决?
type NavigationProperties<T, TKey extends keyof T> = T[TKey] extends object ? TKey : never;
type Relationship<T extends { [k in TMember]: TTarget }, TMember extends keyof T, TTarget extends object = object> = {
name: TMember,
isComposite?: boolean,
};
class A<TObject extends object>
{
public readonly relationships: Partial<{ [k in NavigationProperties<TObject, keyof TObject>]: Relationship<TObject, k> }> = { }
}
编辑
根据 Shivam 的要求,我正在为其添加更多上下文:当我有混合类型或不匹配类型时,我也想让它工作: 操场
解决方案
问题
在类型Relationship
中,T
被约束到{ [k in TMember]: TTarget }
,同时声明属性relationships
,TObject
被传递的类型object
是 的超类型{ [k in TMember]: TTarget }
。因此不兼容。
解决方案
type NavigationProperties<T, TKey extends keyof T> = T[TKey] extends object ? TKey : never;
type TObject<T extends object, TType extends object> = { [K in keyof T]: TType }
type Relationship<T extends TObject<T, TType>, TKeys extends keyof T, TType extends object> = {
name: TKeys,
isComposite?: boolean,
};
type Relationships<T extends TObject<T, TType>, TType extends object> = {
[K in NavigationProperties<T, keyof T>]?: Relationship<T, K, TType>
}
class A<T extends TObject<T, TType>, TType extends object = object> {
public readonly relationships: Relationships<T, TType> = { }
}
// example usage
type MyType = {
prop1: number
porp2: string
}
type X = {
a: MyType
b: MyType
}
declare const obj: A<X>
obj.relationships // type is Relationships<X, object>
// type of obj1.relationships.a is Relationship<X, "a", object>
obj.relationships.a?.name // "a"
obj.relationships.b?.name // "b"
declare const obj1: A<X, MyType>
obj1.relationships // type is Relationships<X, MyType>
// type of obj1.relationships.a is Relationship<X, "a", MyType>
obj1.relationships.a?.name // "a"
obj1.relationships.b?.name // "b"
推荐阅读
- junit - 模拟第三方服务
- regex - 我如何编写正则表达式以仅接受数字作为 antd 输入
- c# - 在 Entity Framework Core 中使用 Fluent API 编写范围数据注释
- node.js - Node fluent-ffmpeg 杀死进程杀死服务器 - 如何启动和停止记录器?
- angular - 如何将单个组件路由默认为组件 Angular
- c# - 将字符串保存在用户无权访问的安全存储中
- angular - 离子选择 ngModel 未使用 ionic 4 更新
- javascript - 在环境变量中下载并添加 Chromebinary
- javascript - 如何在特定时间触发css转换
- excel - 如何使 Excel 数据透视表在 Google Sheet 中工作?