根据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 {
...
}
我对这个谜一直感到困惑。我真的很感激任何帮助。
谢谢!
这是一个很好的问题!我能想到的最好的是你的代码看起来是正确的,流程可能应该支持这种情况。在此期间,您可以在转回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)
也许文字字符串和动态字符串在引擎盖下被区别对待,导致类型处理的奇怪差异?
从实用的角度来看,如果你最终做出魔法,那么为这个函数应该处理的不同情况添加单元测试是明智的。