2017-10-08 104 views
1

创建具有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; 
} 
  1. 什么是<{}>注释的目的或者是什么呢验证有关的代码?
  2. <{}>相当于<Object>
  3. 我误解了什么吗?

谢谢!

+0

关于2:NO,因为'{}'注释定义了一个密封的对象类型,而'Object'是未封闭的 – ftor

回答

1

Objects (and functions) in Flow are structurally typed。这就是说,匹配{...}类型的所有属性和类型的对象都是它的子类型。在{}的情况下,这包括所有真实的对象(因此禁止数组和文字),实际上也是Object === {}

您与string例子是根本不同的,这是因为文字类型,如a: "foo"串的那些情况下,即"fo"不是"foo"子类型。

至于该泛型的实际用途,Component由Flow typechecker专用,实际上您可以完全省略泛型,因为它们可以从属性类型中推断出来。第一个通用参数是道具的类型,第二个是该州的类型。 See the docs

相关问题