- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解 Flow 如何决定泛型类型使用什么类型,以及是否有办法控制推断泛型类型的级别(我的意思是进一步解释)。
This question is inspired by How to type a generic function that returns subtypes. I think there is a distinction between the two questions because this one focuses on understanding how
T
is chosen, where as the linked on is focuses on typing the return type of a function.
function identity<T>(value: T): T;
function identity<T>(value: T): T {
if (typeof value === 'string') {
return '';
}
return value;
}
string
当
string
已输入,否则返回原
value
类型
T
——但出于某种原因,Flow 不喜欢这样。
value.substr(0, 0)
而不是空字符串, Flow 将不再提示,并且无法返回严格相等的值,
function identity<T>(value: T): T {
if (value === '') {
return '';
}
return value;
}
const x: 5 = 5; // literal type
const x: number = 5; // JavaScript type
T => T
类型的函数时,我们不知道 Flow 是将文字类型还是 JavaScript 类型推断为类型。
T => T
,但希望可以防止 Flow 提示返回默认值。
最佳答案
如果没有直接回答问题,希望在这里能说明正在发生的事情。
让我们首先举你的第一个例子:
function identity<T>(value: T): T {
if (typeof value === 'string') {
return '';
}
return value;
}
identity<T>(T): T
.这基本上是说:
T
这可以是任何东西( <T>
)。 T
类型的参数。 . T
类型的值. T
的类型也不会改变。也不会改变。
identity
必须返回
T
的确切类型,不是其类型的子集。让我们来看看为什么。
identity<'some string'>('some string');
T
的类型是文字类型,
'some string'
.在调用上述函数的情况下,我们会发现
typeof value === 'string'
并尝试返回
''
,
string
.
string
但是,是
T
的父类(super class)型这是
'some string'
,所以我们违反了函数的契约。
function identity<T>(value: T): T | string {
if (typeof value === 'string') {
return '';
}
return value;
}
T
的返回类型只有完全匹配的东西才能满足
T
,在我们签名的情况下只能是
value
.但是,我们有一个特殊情况,即
identity
可能会返回
string
,所以我们的返回类型应该是
T | string
的并集(或者,如果我们想要 super 具体,
T | ''
)。
function identity<T>(value: T): T {
if (value === '') {
return '';
}
return value;
}
value === ''
作为一种细化机制。流程中的细化非常挑剔,我喜欢将其视为在我的代码上运行的一些简单正则表达式的列表。确实只有将类型细化为字符串的方法,那就是使用
typeof value === 'string'
.其他比较不会细化到字符串。精炼泛型肯定也有一些奇怪的地方,但像这样的东西工作正常(精炼确实如此,当然它仍然表现出以前与泛型相关的错误):
function identity<T>(value: T): T {
if (typeof value === 'string' && (value: string) === '') {
return '';
}
return value;
}
substr
例如,这对我来说绝对是一个错误。似乎你可以用
String
上的任何方法做同样的事情。返回
string
,例如
concat
或
slice
.
I would like to know if there is some way of either knowing what Flow infers for generic types in a function
T
是
T
,本质上是一个未知类型,除非它有边界,在这种情况下,它是一个与这些边界匹配的未知类型)。 Flow 可以推断进入函数调用的参数类型,但这应该与函数的编写方式无关。
or if there is a way to scope the generic type to be at the "literal" level or "JavaScript" level. With this ability, we could type function that coerces values to the default value for that type (i.e., strings would go to the empty string, numbers would go to 0). Here the type of the function would effectively be T => T, but hopefully Flow could be prevented from complaining about returning the default values.
T => T
.正如我上面所展示的,破坏这样的实现是微不足道的。
关于flowtype - Flow 如何解释泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736465/
我已经搜索了 flowtype 的文档,但找不到与类型推断相关的内容,例如: function add(x){ return x+10; } 使用flowtype后变成: function add
在以下示例中,由于我使用 switch 语句匹配消息类型,因此我希望流程能够识别我的错误大小写“ENUM_TYPO”。目前没有。 type Message = 'BROADCAST_MESSAGE'
我是spacemacs扇子。我想使用Facebook Flow但我不知道如何将它与 spacemacs 集成。我正在将 flow 与 nuclide 结合使用,但我需要重新学习一切才能提高工作效率。有
为了性能起见,我想忽略我的 .flowconfig [ignore] 部分中的整个 node_modules,但包括我使用的一些目录,例如“react”。 有人知道怎么做吗? 我基本上想忽略所有影响
安装在package.json上 "babel-preset-flow": "^6.23.0", "eslint-plugin-flowtype": "2.35.1", "flow-bin": "^0
想到一个简单的例子比如: class CommentAreaComponent extends React.Component { static propTypes = { id: PropT
我想确保我得到的值是一个十六进制字符串。目前我说 type Color = string; function foo(color: Color){} 但我想说 type Color = '#' + s
我不知道如何在两个文件中共享类型定义。考虑: // /file_a.js export const randomVariable: MySharedType = {thing: true}; // /
Flow 的文档说:When you create an object without any properties, you create an unsealed object type in Fl
免责声明:一般来说,我还是有点新的 Flow 和静态类型,所以我很可能忽略了这个问题的一些简单/明显的东西。 假设我有一个名为 my-library 的库.该库向其用户公开了一个模块,index.js
给定以下代码: /* @flow */ interface IDefaultSettings { Drivers?: {}, Options?: {} } const defaultSetti
我试图定义一个对象不能有某个键。 这是我的案例: alert({ items: [{ label:'Apple' }, { label:'Orange' }] }) alert({ ite
添加Flowtype是否可行现有的大型项目? 我添加了 /* @flow weak */到单个 .js文件,然后运行 flow check它突出了对全局定义库的大量函数调用,因为它不知道它们是什么
如何在流程中实现以下目标 export type Response = { err: string, data: ?Array, } | { data: Array, }; 我想表达一个类
我对flow check和flow的作用尚不完全清楚。运行flow似乎可以启动服务器,并检查所有代码。由于服务器正在运行,因此flow的后续执行速度更快。 flow check似乎也进行了完整的代码检
在 Flow 中,为什么要使用类而不是类型? type Point = {x: number; y: number}; class Point = {x: number; y: number}; 最佳
很多时候我发现自己作为 arg 传递了一个特定的 Shape 类型,但是每个键都是可选的,只有至少一个是必需的。 例如: type Shape = { +isFetching: boolean
我想知道如何避免这些大量的空检查,或者至少了解重点是什么,因为它似乎适得其反。 如果我省略空检查,Flowtype 会给我一个错误: var myEl = new MyElement() if (do
我有一个函数foo : function foo(a: string, b: string, c: number, d: boolean): Promise { return new Promis
给定默认值,如何定义config参数的类型? function (config = {}) {}; 最佳答案 function f(config: Object = {}) {} 或者,更一般而言:
我是一名优秀的程序员,十分优秀!