如何键入返回子类型的泛型函数

问题描述 投票:3回答:1

根据flow's documentation,流量中的泛型跟踪值。

这意味着这会引发错误:

function identity<T>(value: T): T {
  if (typeof value === 'string') {
    // $ExpectError
    return '';
  }

  return value;
}

据我所知,他们的文档没有提到如何最好地键入这样的函数。理想情况下,您希望指定该函数返回输入类型的子类型。

具体来说,我想避免那些不太安全的打字:

function identity<T>(value: T): (T | string) {
  ...
}

要么

function identity(value: mixed): mixed {
  ...
}

我对这个谜一直感到困惑。我真的很感激任何帮助。

谢谢!

generics flowtype
1个回答
0
投票

这是一个很好的问题!我能想到的最好的是你的代码看起来是正确的,流程可能应该支持这种情况。在此期间,您可以在转回any之前强制转换为T,以便该函数具有正确的签名:

// Has the inferred signature `<T>(value: T) => T`
function identity<T>(value: T) {
  if (typeof value === 'string') {
    return ((value: any): T)
  }

  return value;
}

(Qazxswpoi)

奇怪的是,我还发现在值上使用Try并将返回类型注释为substr可以导致T被接受而没有错误,尽管它与返回T => T基本相同(?!?!)

''

(Qazxswpoi)

也许文字字符串和动态字符串在引擎盖下被区别对待,导致类型处理的奇怪差异?

从实用的角度来看,如果你最终做出魔法,那么为这个函数应该处理的不同情况添加单元测试是明智的。

© www.soinside.com 2019 - 2024. All rights reserved.