- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图定义一个对象不能有某个键。
这是我的案例:
alert({
items: [{ label:'Apple' }, { label:'Orange' }]
})
alert({
items: [{ foo:'Apple' }, { foo:'Orange' }]
labelKey: 'foo'
})
如果items是一个不包含“label”键的对象数组,那么Options中需要labelKey
我试过这个:
type Options = {|
items: Array<{ label:string }>
|} | {|
items: Array<$Diff<{}, { label:string }>>,
labelKey: string // must be key in items
|}
function alert(options: Options) {
}
奖金问题:也可以定义 labelKey 是项目中传递的对象中的任意键吗?
最佳答案
{ myProp?: empty }
我假设您想使用 objects as maps当您将某些内容传递给 alert
函数时。创建没有标签的 map 的诀窍是提供一个属性,如果分配给某物,将无法进行类型检查。
我们可以利用 empty
type ,一种不匹配任何东西的类型,以获得预期的效果。将 empty
类型与对象映射结合使用有点棘手,因为通过定义属性,我们告诉流我们希望该类型位于对象中。所以这无法进行类型检查:
( Try )
type MapWithLabel = {
[string]: string,
label: string,
}
type MapWithoutLabel = {[string]: mixed, label: empty}
type Options = {|
items: Array<MapWithLabel>
|} | {|
labelKey: string,
items: Array<MapWithoutLabel>,
|}
declare function alert(options: Options): void;
alert({
items: [{ foo:'Apple' }], // Error, expected a "label" property with empty type
labelKey: 'foo'
})
接下来,我们可以将属性定义为optional ,这意味着如果该属性存在,则仅对 empty
进行类型检查。有了这个,我们可以给对象一个“标签”属性:
因此代码可以没有该属性的值(我们想要的),或者它可以传递空的东西(这是不可能的)。
( Try )
type MapWithLabel = {
[string]: string,
label: string,
}
type MapWithoutLabel = {[string]: mixed, label?: empty}
type Options = {|
items: Array<MapWithLabel>
|} | {|
labelKey: string,
items: Array<MapWithoutLabel>,
|}
declare function alert(options: Options): void;
alert({
items: [{ label:'Apple' }],
})
alert({
items: [{ label:'Apple' }], // Error - Should not have label
labelKey: 'ohno',
})
alert({
items: [{ foo:'Apple' }],
labelKey: 'foo'
})
alert({
items: [{ foo:'Apple' }], // Error - Needs a labelKey
})
因此,为了获得预期的效果,我们需要利用两个工具:可选属性和 empty
类型。有了它,我们可以指定一个对象,如果该 empty
属性存在,该对象将无法进行类型检查。
关于奖励问题:我不确定 Flow 能否理解这一点,因为我不知道在对象上设置变量属性的方法。我不希望有此功能,因为它会使事情变得复杂/无法进行类型检查。
编辑:经过更多研究,您可以使用indexer properties断言一个对象在类型级别有一个键:
(Try)
type ObjWithKey<T: string = 'label'> = {
// An indexer property with only one valid value: T with "label"
// as default, but we can't ensure that the property exists anymore
// and multiple indexers are not supported.
[T]: string,
aNumber: 3,
aFunction: () => void,
}
declare var usesLabel: ObjWithKey<>
(usesLabel.label: string);
(usesLabel.aNumber: number);
(usesLabel.missing: number); //Error - Doesn't exist on object
(usesLabel.aFunction: () => void);
(usesLabel.aFunction: string); //Error - Wrong type
但是,您不能这样做并且将该对象用作通用 map ,因为不支持多个索引器属性 (Try)。作为引用,其他人试图做其他类似的事情,but couldn't get it to work .
如果这对您来说是一个主要问题,请查看您是否可以以不同的方式构建您的数据结构,以便更轻松地使用 Flow 进行静态分析。
关于flowtype - 对象不能有键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49578103/
我已经搜索了 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 = {}) {} 或者,更一般而言:
我是一名优秀的程序员,十分优秀!