为什么打字稿泛型推理优先考虑参数而不是赋值?

Why does typescript generic inference prioritizes arguments overs assignment?

Typescript 泛型推断优先于参数而不是赋值。因为它优先考虑参数,所以任何参数道具都会自动转换为类型 unknown,即使我将它分配给一个类型参数设置为对象接口的变量。

interface Person {
  name: string;
  age: number;
  id: string;
}

interface Client {
  person: Person;
}

class FormField {  }

class FormFieldGroup<T> {
  constructor(private props: { category: string, questions: FormRelation<Required<T>> }) {}
}

type Primitives = string | number | symbol | bigint | undefined | null;

type FormRelation<T> = {
  [K in keyof T]: T[K] extends Primitives ? FormField : FormFieldGroup<T[K]>;
}

abstract class CRUDComponent<D> {
  public abstract clientQuestions: FormRelation<D>
}

class ClientComponent extends CRUDComponent<Client> {
  public clientQuestions: FormRelation<Client> = {
    person: new FormFieldGroup({
      category: "Client",
      questions: {
        name: new FormField(),
        age: new FormField(),
        id: new FormField(),
      }
    })
  }
}

VScode: Cannot assign FormQuestionGroup<{name: unknown, age: unknown, id: unknown}> to FormQuestionGroup<Person>.

在Java中,菱形运算符自动推断类型以匹配赋值类型参数。但是,出于可读性考虑,Typescript 不包含菱形运算符。我正在使用 typescript 3.7,只是想知道除了指定类型之外是否有解决此错误的方法。

此外,当我将 props 设置为空对象时,编译器能够将泛型推断为正确的接口。

Typescript Playground

您只需要用 type NoInfer<T> = [T][T extends any ? 0 : never] 包装类型以禁用参数推断。