typescript - 2322:可分配给“T”类型的约束,但“T”可以用不同的约束子类型实例化
问题描述
有人会知道为什么addChildrenDefaultValue
有效但addChildrenDefaultValue2
会抛出
Type '(Omit<T, "children"> & { children: ObjectWithChildren<TestObject>[]; })[]' is not assignable to type 'ObjectWithChildren<T>[]'.
Type 'Omit<T, "children"> & { children: ObjectWithChildren<TestObject>[]; }' is not assignable to type 'ObjectWithChildren<T>'.
Type 'Omit<T, "children"> & { children: ObjectWithChildren<TestObject>[]; }' is not assignable to type 'T'.
'Omit<T, "children"> & { children: ObjectWithChildren<TestObject>[]; }' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'TestObject'.(2322)
? 有一个更好的方法吗?(我在我的用例中使用了扩展原因,它扩展了更多类型)
interface TestObject{
name: string;
children?: TestObject[] | null;
}
type ObjectWithChildren<T> = T & {children: ObjectWithChildren<T>[]};
function addChildrenDefaultValue(
taxonomy: TestObject[]
): ObjectWithChildren<TestObject>[] {
return taxonomy.map(({children, ...props}) => {
return {...props, children: addChildrenDefaultValue(children ?? [])};
});
}
function addChildrenDefaultValue2<T extends TestObject>(
taxonomy: T[]
): ObjectWithChildren<T>[] {
return taxonomy.map(({children, ...props}) => {
return {...props, children: addChildrenDefaultValue2(children ?? [])};
});
}
解决方案
考虑以下类型
type TestObjectExtended = TestObject & {
age: number
}
children
中的属性类型TestObjectExtended
是TestObject[] | null | undefined
。因此,在函数addChildrenDefaultValue2
中, 的属性children
将T
具有相同的类型 - TestObject[] | null | undefined
。
现在在map
函数的回调/映射器中,children
有类型TestObject[] | null | undefined
而不是T[] | null | undefined
. 在 的递归调用中addChildrenDefaultValue2
,children 不一定满足函数的约束,因为它是TestObject[]
(如果不是undefined
/ null
)但预期是T[]
。
量子点
推荐阅读
- java - 如何构建 AOSP 以获取 jar 文件?
- python - Windows 中没有名为“_swigfaiss”的模块
- redux - distinctUntilChanged:旧值始终为空
- javascript - 带有“unsafely-treat-insecure-origin-as-secure”标志的无头 Chrome 上的媒体设备行为不一致
- apache - 重写规则,它接受通配符并将其添加到目标页面
- java - 尽管授予权限,Spring Security 仍拒绝访问“@Secured”方法
- java - 基于其中存在的日期/时间的 Json 数组排序
- python - 如何修复:python 代码无法通过 DAG 气流工作:pandas.read_csv('gs://x/y.csv') 文件不存在
- ruby - 为什么我在部署 capistrano 时会出现语法错误?
- tensorflow - 具有图像和标量的 keras 生成器