gpt4 book ai didi

javascript - 我们如何创建一个我们应该实现的对象的 'skeleton type' ?

转载 作者:行者123 更新时间:2023-12-01 00:39:51 25 4
gpt4 key购买 nike

我想为我们应该实现的对象文字声明一个“骨架”接口(interface)。

当时我们正在创建AttributeGettersSkeletonType ,我们不知道 getter 将返回什么类型 - 只知道必须有名为 getColor 的方法。 , getMake ,和getYear在对象上,并且它们应该返回...某物的 Promises。

但是当我们实现该对象时,我们知道 promise 值的类型是什么,并且我们想告诉流程这一点。

// @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 内的类型节,但我希望有一种方法可以在我们创建对象时告诉流正确的类型。我的尝试是(() => Promise.resolve(1994): () => Promise<number>) ,明确提供更精致的类型。

想法?

谢谢!

最佳答案

这就是 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 对象实际传递给使用该类型作为参数的函数。

关于javascript - 我们如何创建一个我们应该实现的对象的 'skeleton type' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797436/

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