gpt4 book ai didi

javascript - 流类型注解 : why `ClassName<{}>` ?

转载 作者:行者123 更新时间:2023-11-29 21:00:41 25 4
gpt4 key购买 nike

使用 react-native init AwesomeProject 创建一个新的 React-Native 项目,我被<{}>搞糊涂了在此类声明中,在生成的 App.js 中:

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 :

The .prototype of the extension must be an Object or 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. 我是不是误会了什么?

谢谢!

最佳答案

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

您使用 string 的示例根本不同,因为像 a: "foo" 这样的文字类型那些字符串实例,即"fo" 不是 "foo" 的子类型。

至于泛型的实际用途,Component 由 Flow 类型检查器特化,实际上您可以完全省略泛型,因为它们可以从属性类型中推断出来。第一个通用参数是 Prop 的类型,第二个是状态的类型。 See the docs .

关于javascript - 流类型注解 : why `ClassName<{}>` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46635606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com