>',typescript,conditional-statements,typeerror,typescript-generics"/>

首页 > 解决方案 > 输入 'ClassA<{ id: number; 名称:字符串;}>' 不可分配给类型 'ClassA>'

问题描述

我有一个 ClassA 应该只允许对象作为值类型。但是应该可以将您自己的对象类型作为泛型类型传递。完成Record<string, any>{ [key: string]: any }。按预期工作。

但是,一旦我尝试使用简单的条件类型提取 ClassA 泛型类型。

class ClassA<DataType = Record<string, any>>{
    public data: { [key: string]: ClassB<DataType> };
    constructor(){
      this.data = {};
    }
}

type NonArrayType<T> = T extends ClassA<infer U> ? U[] : never;

// Test function to test the 'NonArrayType' type
export function useWithoutArray<X extends ClassA>(
  deps: X
): NonArrayType<X> {
  return '' as any; // Doesn't matter
}

// Drops type error
const test6 = useWithoutArray(new ClassA<{ id: number; name: string }>()); 

我得到一个

Type 'ClassA<{ id: number; name: string; }>' is not assignable to type 'ClassA<Record<string, any>>'.

类型错误。在某种程度上它是有道理的,但在理论上{ id: number; name: string; }Record<string, any>

连线的事情是它可以在打字稿操场上与一个缩小的例子一起使用..但在我的框架中却不行

这是实际问题: https ://github.com/agile-ts/agile/issues/76

谢谢

标签: typescriptconditional-statementstypeerrortypescript-generics

解决方案


它是固定在这个操场上还是你的意思是别的?如果它如此简单,那么不提供一个最小的可重复示例是一种耻辱,因为如果人们可以在那里看到错误,他们就可以投入其中。我不得不做很多想象你的意思。无论如何,下面没有编译错误。

class ClassA<T, V extends Record<string,T> = Record<string,T>> {
  constructor(readonly value:V){}
}

type NonArrayType<T> = T extends ClassA<infer U> ? U[] : never;

// Test function to test the 'NonArrayType' type
export function useWithoutArray<T,X extends ClassA<T>>(
  deps: X
): NonArrayType<X> {
  return '' as any; // Doesn't matter
}

// Drops type error
const test6 = useWithoutArray(new ClassA<any, { id: number; name: string }>({id:3,name:"john"})); 

推荐阅读