在Flow 0.34中定义一个自定义的' toString '

Defining a custom `toString` in Flow 0.34

本文关键字:一个 自定义 toString Flow 定义      更新时间:2023-09-26

我有一些函数我想有一个自定义的toString属性,像这样:

var Foo = function () {};
Foo.prototype.toString = function () { return 'hi'; };

下面是一个示例代码:

在Flow 0.33中没有错误,但在Flow 0.34中它产生一个错误:

4: Foo.prototype.toString = function () { return 'hi'; };
   ^ Object. Covariant property `toString` incompatible with contravariant use in
4: Foo.prototype.toString = function () { return 'hi'; };
   ^ assignment of property `toString`

这是一个bug在我的代码或流?

您可以使用any类型转换来绕过协方差约束:

(Foo.prototype : any).toString = function () { return 'hi'; };

你的代码没有错,流只是强制一个特定的风格。

虽然Flow对这种类型的类声明的支持有限,但我强烈建议使用ES6语法。一次性声明风格有助于Flow更容易地理解代码。

class Foo {
  toString() {
    return 'hi';
  }
}

一种超级愚蠢的方法(欺骗转译器;尽量避免):

Object.assign(Utils, { ['to'+'String']: (s/*:any*/)/*:string*/ => ''+ s });

我更喜欢上面答案中任意一个casting的例子。

(Utils/*:any*/).toString = (s/*:any*/)/*:string*/ => ''+ s;

然而,我也需要这个,(如果你改变方法签名,当你去调用它):

Utils.stringEquals = (a/*:any*/,b/*:any*/)/*:%checks*/ =>
    (Utils/*:any*/).toString(a) === (Utils/*:any*/).toString(b);