TypeScript泛型为何无法跨接口与函数签名自动推断?
TypeScript泛型无法自动推断的问题解决
问题原因
TypeScript 4.7.4不会从变量的初始化值反向推断泛型接口的类型参数——哪怕你已经指定了回调函数的参数类型,泛型接口本身仍然要求显式传入类型参数,这是TS泛型推断规则的限制:只有泛型函数、泛型类构造函数等场景才支持自动推断,泛型接口/类型别名不支持从赋值语句推导类型参数。
解决方法
1. 显式传入泛型类型参数
直接在使用接口时指定T的具体类型,这是最直接的解决方式:
type TypeOfSomething = "something" | "other thing"; interface HigherLevel<T extends TypeOfSomething> { subsection: MidLevel<T>; } interface MidLevel<T extends TypeOfSomething> { callback: (arg: T) => void; } // 类型断言写法 const t = { subsection: { callback: (arg: "something") => {} } } as HigherLevel<"something">; // 类型注解写法 const t2: HigherLevel<"something"> = { subsection: { callback: (arg: "something") => {} } };
2. 用泛型函数辅助自动推断
通过泛型函数包裹对象创建逻辑,让TS从函数参数自动推断泛型类型:
type TypeOfSomething = "something" | "other thing"; interface MidLevel<T extends TypeOfSomething> { callback: (arg: T) => void; } interface HigherLevel<T extends TypeOfSomething> { subsection: MidLevel<T>; } // 泛型函数用于推断类型 function createHigherLevel<T extends TypeOfSomething>(obj: HigherLevel<T>) { return obj; } // TS自动推断T为"something" const t = createHigherLevel({ subsection: { callback: (arg: "something") => {} } });
3. 给泛型接口设置默认类型参数
如果可以接受默认的宽泛类型,可给泛型指定默认值,避免未传参数时报错(注意这是指定默认值,不是自动推断):
type TypeOfSomething = "something" | "other thing"; interface MidLevel<T extends TypeOfSomething = TypeOfSomething> { callback: (arg: T) => void; } interface HigherLevel<T extends TypeOfSomething = TypeOfSomething> { subsection: MidLevel<T>; } // 此时不会报错,但T的类型是TypeOfSomething而非"something" const t: HigherLevel = { subsection: { callback: (arg: "something") => {} } };
内容的提问来源于stack exchange,提问作者Smartguy 88
相关产品推荐
相关产品推荐

