首页 > 解决方案 > 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 ?? [])};
  });
}

标签: typescript

解决方案


考虑以下类型

type TestObjectExtended = TestObject & {
    age: number
}

children中的属性类型TestObjectExtendedTestObject[] | null | undefined。因此,在函数addChildrenDefaultValue2中, 的属性childrenT具有相同的类型 - TestObject[] | null | undefined

现在在map函数的回调/映射器中,children有类型TestObject[] | null | undefined而不是T[] | null | undefined. 在 的递归调用中addChildrenDefaultValue2,children 不一定满足函数的约束,因为它是TestObject[](如果不是undefined/ null)但预期是T[]

量子点


推荐阅读