TS:跨多个接口的类型推断和函数签名不推理?

TS: Type inference across multiple interfaces and function signature not inferring?

提问人:Smartguy 88 提问时间:10/1/2022 更新时间:10/1/2022 访问量:101

问:

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

为什么会这样?我已经在回调函数中指定了 的类型,所以打字稿不应该能够推断类型参数吗?argHigherLevel

我正在使用 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

TypeScript :类型推理函数 签名

评论

1赞 captain-yossarian from Ukraine 10/1/2022
请参阅示例。 期望通用参数,它是必需的,您不允许省略它。如果要省略,则应指定默认泛型值,如下所示HigherLevel

答:

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
是的,我已经采取了这种做法,对于更复杂的嵌套类型,它可能会变得有点冗长,但我同意,没有其他方法