【问题标题】:How can we create a 'skeleton type' of an object that we should implement?我们如何创建我们应该实现的对象的“骨架类型”?
【发布时间】:2019-09-05 13:00:17
【问题描述】:

我想为我们应该实现的对象字面量声明一个“骨架”接口。

在我们创建 AttributeGettersSkeletonType 时,我们不知道 getter 将返回什么类型 - 只是 必须 有称为 getColorgetMake 和 @ 的方法987654324@ 在对象上,并且他们应该返回 Promises of...something。

但是当我们实现对象时,我们知道承诺值的类型,并且我们想告诉流程。

// @flow strict

type AttributeGettersSkeletonType = {|
  getColor: () => Promise<mixed>,
  getMake: () => Promise<mixed>,
  getYear: () => Promise<mixed>,
|};

const carDetails = ({
  getColor: () => Promise.resolve('blue'),
  getMake: () => Promise.resolve('honda'),
  getYear: (() => Promise.resolve(1994): () => Promise<number>),
}: AttributeGettersSkeletonType);

carDetails.getYear().then(year => {
    const yearPlusOne = year + 1;
})

现在,这会产生:

16:     const yearPlusOne = year + 1;
                           ^ Cannot add `year` and `1` because mixed [1] could either behave like a string or like a number.
References:
6:   getYear: () => Promise<mixed>,
                            ^ [1]

我知道一种解决方案是优化 then 节中的类型,但我希望有一种方法可以在我们创建对象时告诉 flow 正确的类型。我的尝试是(() =&gt; Promise.resolve(1994): () =&gt; Promise&lt;number&gt;),明确地提供了一个更精致的类型。

想法?

谢谢!

【问题讨论】:

  • 您是否在寻找any 而不是mixed
  • Nah - any 将从该变量中删除流输入,并允许我用它做任何事情
  • 啊,我明白了。我误解了你的整体问题,抱歉。

标签: javascript types flowtype


【解决方案1】:

这就是generic types 通常的用途,例如

type AttributeGettersSkeletonType<C, M, Y> = {|
  getColor: () => Promise<C>,
  getMake: () => Promise<M>,
  getYear: () => Promise<Y>,
|};

const carDetails = ({
  getColor: () => Promise.resolve('blue'),
  getMake: () => Promise.resolve('honda'),
  getYear: () => Promise.resolve(1994),
}: AttributeGettersSkeletonType<string, string, number>);

carDetails.getYear().then(year => {
    const yearPlusOne = year + 1;
});

虽然我可能会把中间部分写成

const carDetails: AttributeGettersSkeletonType<string, string, number> = {
  getColor: () => Promise.resolve('blue'),
  getMake: () => Promise.resolve('honda'),
  getYear: () => Promise.resolve(1994),
};

或完全省略类型声明,直到 carDetails 对象实际传递给具有该类型作为参数的函数。

【讨论】:

  • 明白了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多