回调的Flowtype注释

Art*_*yak 4 javascript flowtype

当我试图使这个注释Flowtype不检查类型

declare function MyType(x: number): void;
type PropsT = {
  onClick?: MyType;
};

props.onClick && props.onClick(); // no check
Run Code Online (Sandbox Code Playgroud)

但这很有效.

type PropsT = {
  onClick?: (x: number) => void;
};
props.onClick && props.onClick(); // ERROR
Run Code Online (Sandbox Code Playgroud)

问题 - 为什么?

vku*_*kin 6

在编写时declare function MyType,不要声明类型名称MyType,但声明MyType存在具有指定签名的函数.所以,MyType是一个价值,而不是一个类型.通常,当您使用值作为类型时,Flow将打印如下内容:

Ineligible value used in/as type annotation (did you forget 'typeof'?)
Run Code Online (Sandbox Code Playgroud)

唯一的例外是功能.Flow允许使用函数作为类型来支持旧样式类:

function Foo() {}
const foo: Foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些类的行为大多是不安全的,Flow推断某些属性的类型,但将其他所有内容视为any.

长话短说,你需要补充typeof:

type PropsT = {
  onClick?: typeof MyType;
};
Run Code Online (Sandbox Code Playgroud)