我想了解 Flow 如何决定泛型类型使用什么类型,以及是否有办法控制推断泛型类型的级别(我的意思是进一步解释)。
这个问题的灵感来自How to type a generic function that returns subtypes。我认为这两个问题是有区别的,因为这个问题侧重于理解如何
T选择,而链接则侧重于键入函数的返回类型。
身份函数是一个很好的剖析示例。它的类型相当简单
function identity<T>(value: T): T;
Run Code Online (Sandbox Code Playgroud)
这似乎足以了解实现应该是什么。但是,我觉得这种类型不足以知道身份函数实际上是做什么的。例如,我们可以(正如链接的问题试图做的那样),
function identity<T>(value: T): T {
if (typeof value === 'string') {
return '';
}
return value;
}
Run Code Online (Sandbox Code Playgroud)
这不会进行类型检查,Flow 会抱怨返回空字符串。然而,我想在许多语言中这会很好——我们在输入astring时返回 a string,否则我们将返回value类型的原始值——T但出于某种原因 Flow 不喜欢这样。
这个答案让我的困惑更加复杂,我们可以返回value.substr(0, 0)而不是空字符串并且 Flow 将不再抱怨,并且无法返回严格相等的值,
function identity<T>(value: T): T {
if (value === '') {
return '';
}
return value;
}
Run Code Online (Sandbox Code Playgroud)
我认为造成这种差异的一个主要原因是,除了“JavaScript 类型”之外,文字还可以像 Flow …
flowtype ×1