gpt4 book ai didi

javascript - Flow 中的可组合契约(Contract)和积极契约(Contract)

转载 作者:行者123 更新时间:2023-11-29 15:09:58 27 4
gpt4 key购买 nike

我在使用 Flow 时遇到问题,其中给定的已实现 type 通过要求我仅使用在 type 上声明的属性而不是来限制我的对象 API要求我声明所有 type 的属性。

我是 Flow 的新手,所以我可能会犯一些基本错误之类的。不管怎样,我声明了这个 type:

type Unit = {
of(value: any): Monad,
};

我在这里想说的是:所有根据 Unit 实现的对象都必须有一个 #of 方法接收给定的 value 并返回一个 Monad 类型的值。

当我在我的工厂实现它时没有出现问题:

const Maybe: Unit = {
isMaybe: (obj): boolean => { ... },
of: (value): Monad => { ... },
};

但是当我尝试调用 #isMaybe 时,我得到了这个错误(在 linter 上):

flow(0|2), isMaybe (Cannot call: `Maybe.isMaybe` because property `isMaybe` is missing in `Unit` [1].)

现在我尝试在 Unit 上声明 #isMaybe 并且错误按预期消失了。问题是,Unit 应该是一种自由接口(interface),检查它的实现是否具有 Unit 属性,而不是 only Unit 属性。

我无法重构 - 至少我不知道 - Unittypeinterface 因为我正在组合它们通过 is-a 关系:

type Monad = Applicative & Chain; // Monad is-a Applicative and a Chain

有什么方法可以使契约(Contract)既积极又可与 Flow 组合?

最佳答案

我对 positive 和 composable 也不太熟悉,但我认为 interface 可以帮助解决问题。您可以轻松扩展 interface 并将变量声明为一个。查看下面的示例,了解如何使用和扩展接口(interface)。请注意,在这种特殊情况下无需通过类(class)。

type Monad = any;

interface Unit {
of(value: any): Monad;
}

const unit: Unit = {
of(value: any): Monad {
return value;
}
}

const notUnit: Unit = {};

const alsoNotUnit: Unit = {
isMaybe(value: any): boolean {
return false;
}
}

interface Maybe extends Unit {
isMaybe(value: any): boolean;
}

const maybe: Maybe = {
isMaybe(value: any): boolean {
return true;
},
of(value: any): Monad {
return value;
}
}

const notMaybe: Maybe = {
isMaybe(value: any): boolean {
return true;
}
};

const alsoNotMaybe: Maybe = {
of(value: any): Monad {
return value;
}
}

Ttry Flow

作为警告,因为我看到您使用了 & 交集类型运算符——交集类型目前在 Flow 中已损坏且不一致。我建议暂时不要使用它们。他们的大部分行为都可以通过其他更正确的方式来完成,例如展开运算符或 extends

关于javascript - Flow 中的可组合契约(Contract)和积极契约(Contract),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55868730/

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