为什么打字稿泛型推理优先考虑参数而不是赋值?
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 设置为空对象时,编译器能够将泛型推断为正确的接口。
您只需要用 type NoInfer<T> = [T][T extends any ? 0 : never]
包装类型以禁用参数推断。
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 设置为空对象时,编译器能够将泛型推断为正确的接口。
您只需要用 type NoInfer<T> = [T][T extends any ? 0 : never]
包装类型以禁用参数推断。