流型注释:为什么`ClassName <{}>`?
创建具有react-native init AwesomeProject
新鲜阵营本地项目,我被<{}>
在这个类中声明困惑,产生App.js:流型注释:为什么`ClassName <{}>`?
export default class App extends Component<{}> {
后来我想通了,<{}>
是一个Class Generic流类型注释。
我熟悉generic types in Java并了解它们的用处。
但是,我正在努力理解Flow注释的目的。它完成了什么?据我所知,这是验证App
类将是Object
类型。虽然这似乎是多余的,如果是这样的话,那么我希望它会被写成<Object>
在本react-native source在:
class AnimatedComponent extends React.Component<Object> {
唯一的原因,我能找到解释需要这种类型的检查是在MDN documentation for extends
:
扩展的.prototype必须是Object或null。
是<{}>
<Object>
的简写?如果是这样的话,那么它似乎可以用一个实际的字符串替代指定string
的类型注释,这看起来是错误的。例如:
// @flow
function concat(a: string, b: string) {
return a + b;
}
// as compared to -->
// @flow
function concat(a: "foo", b: "bar") {
return a + b;
}
- 什么是
<{}>
注释的目的或者是什么呢验证有关的代码? - 是
<{}>
相当于<Object>
? - 我误解了什么吗?
谢谢!
Objects (and functions) in Flow are structurally typed。这就是说,匹配{...}
类型的所有属性和类型的对象都是它的子类型。在{}
的情况下,这包括所有真实的对象(因此禁止数组和文字),实际上也是Object === {}
。
您与string
例子是根本不同的,这是因为文字类型,如a: "foo"
是仅串的那些情况下,即"fo"
不是"foo"
子类型。
至于该泛型的实际用途,Component
由Flow typechecker专用,实际上您可以完全省略泛型,因为它们可以从属性类型中推断出来。第一个通用参数是道具的类型,第二个是该州的类型。 See the docs。
关于2:NO,因为'{}'注释定义了一个密封的对象类型,而'Object'是未封闭的 – ftor