提问人:Smartguy 88 提问时间:10/1/2022 更新时间:10/1/2022 访问量:101
TS:跨多个接口的类型推断和函数签名不推理?
TS: Type inference across multiple interfaces and function signature not inferring?
问:
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;
这会引发错误(打字稿错误) 泛型类型“HigherLevel”需要 1 个类型参数.ts(2314)
完全错误:泛型类型“HigherLevel”需要 1 个类型参数.ts(2314)
在线上as HigherLevel
为什么会这样?我已经在回调函数中指定了 的类型,所以打字稿不应该能够推断类型参数吗?arg
HigherLevel
我正在使用 as 子句,使用它键入常量 t 时出现类似的错误:
const t: HigherLevel = { subsection: { callback: (arg: "something") => {} } };
它给了我同样的错误
如果能够推断我的类型,那对我来说会很好,特别是因为我只问这个问题,因为它影响了我试图完成的更复杂的类型。
我不知道这是否是打字稿的一个功能,但在我看来应该是,否则我可能会以错误的方式思考这个问题。
这是一个没有接口的更简单示例,可能更容易解决。我仍然在寻找解决上述更大问题的方法,但这仍然让我感到困惑:HigherLevel
type TypeOfSomething = "something" | "other thing";
interface MidLevel<T extends TypeOfSomething> {
callback: (arg: T) => void;
}
const t: MidLevel = { callback: (arg: "something") => {} };
相同的错误,相同的行:(
TS 版本:4.7.4tsc -V
答:
1赞
Dimava
10/1/2022
#1
我通常使用函数来推断泛型类型
function inferType<V extends TypeOfSomething>(t: HigherLevel<V>) { return t }
const t = inferType({ subsection: { callback: (arg: "something") => {} } })
怀疑还有另一种方法
评论
0赞
Smartguy 88
10/2/2022
是的,我已经采取了这种做法,对于更复杂的嵌套类型,它可能会变得有点冗长,但我同意,没有其他方法
评论
HigherLevel