【问题标题】:Typescript generics return type issuesTypescript 泛型返回类型问题
【发布时间】:2021-03-24 18:23:57
【问题描述】:

我在我的项目中使用 typescript 泛型,但它似乎效果不佳。

示例:

interface Test<T, P> {
  a?: (v: T) => P
  b?: (v: P) => void
}

const fn1 = <T, P>(_config: Test<T, P>) => {}

fn1({
  a: (p) => 1,
  b: (p) => {},
})

我认为params 'a' 输入就像:

Test&lt;unknown, number&gt;.a?: ((v: unknown) =&gt; number) | undefined

但是,实际上:

Test&lt;unknown, unknown&gt;.a?: ((v: unknown) =&gt; unknown) | undefined

我不知道为什么,有人可以帮助我吗?谢谢。

【问题讨论】:

  • 为什么你的界面中有箭头功能?
  • @Phil 他/她是否有理由不应该这样做,或者为什么不希望这样做? (真正的问题)
  • @CertainPerformance 我想我遗漏了一些东西(仍然是一个相对的 TS noob),但你通常不会定义像a?(v: T): P 这样的接口函数。还没有看到箭头语法。 编辑:好的,找到this one... TIL
  • @Phil 据我了解,它们是完全等价的(你甚至可以做一些看起来很傻的事情,比如a?: (this: string, v: T) =&gt; P),所以使用=&gt; 还是: 语法只是一种风格选择
  • 我假设您知道您可以明确指定类型:fn1&lt;unknown, number&gt;({...})

标签: javascript typescript


【解决方案1】:

由于您没有在此行定义类型: b: (p) =&gt; {}

那么 TS 无法推断出 P 的类型,即使您在上述 a 的定义中返回它。

【讨论】:

  • 我在a上定义类型:
  • a: (p: string) =&gt; 1,,TS可以推断出P的类型:Test&lt;string, number&gt;.a?: ((v: string) =&gt; number) | undefined。很奇怪,T和P之间有什么联系吗?
  • 这是一种奇怪的行为,看起来 TS 选择了最安全的打字(最不具体)。我已经使用内置的ReturnType 类型编写了另一个潜在的解决方案,但由于我将其用作索引类型,因此需要存在ainterface Test&lt;T, P&gt; { a: (v: T) =&gt; P b?: (v: ReturnType&lt;Test&lt;T, P&gt;['a']&gt;) =&gt; void }
【解决方案2】:

这是因为在一个联合中,一个未知数吸收了一切。

对于 (a) 中的 P,TypeScript 推断出一种“数字”类型,但是对于 (b) 中的 P,它推断出一种“未知”类型,就像它对于 (a) 中的 T 所做的那样。

因此,P 会导致“数字 | 未知”(而不是您预期的“数字 | 未定义”),这只会导致“未知”。

如果您参考 TypeScript 文档 here,您会发现:

// 在一个联合中,一个未知数吸收一切

类型 P = 未知 |数字; // 未知

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2021-10-06
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多