gpt4 book ai didi

javascript - flowtype 可空对象不可变属性细化

转载 作者:行者123 更新时间:2023-11-30 09:11:57 24 4
gpt4 key购买 nike

我想对可以为 null 的属性进行优化。然后将这个具有 checked 属性的对象作为参数传递给函数。

/* @flow */
const a: {+foo: ?string} = {};

const fun = (obj: {+foo: string}) => {
return obj
}

if (a.foo) {
fun(a) // null or undefined [1] is incompatible with string
}

Try flow

它不应该与具有可变属性的对象一起使用,因为稍后可以将此属性更改为 null。所以这就是我使用不可变属性的原因。但它仍然不起作用。

有没有办法传递具有精炼属性的对象?

最佳答案

细化对象的属性是细化属性,而不是对象。

// `a.foo` is of type `?string`
// `a` is of type `{+foo: ?string}`
if (a.foo) {
// within this block, `a.foo` is of type `string` (no `?`)
// `a` is of type `{+foo: ?string}`
}
// `a.foo` is of type `?string`
// `a` is of type `{+foo: ?string}`

在这种特殊情况下,我可能会这样做:

if (a.foo) {
fun({ foo: a.foo });
}

( Try )

只是因为它是如此简单的案例。在更复杂的情况下,您需要使用 disjoint unions .

type A = {
+foo: string,
};

type B = {
+foo: void,
};

type T = A | B;

const a: T = ({ foo: undefined }: B);

const fun = (obj: A) => {
return obj
}

// `a` is of type `A | B` (which is type `T`)
if (a.foo) {
// inside this block `a` is of type `A`
fun(a);
}
// `a` is of type `A | B` (which is type `T`)

( Try )

归根结底,没有 super 直接的方法可以将 { +foo: ?string } 转换为 { +foo: string } 因为它们是两个完全不同的复杂类型,必须这样处理。

关于javascript - flowtype 可空对象不可变属性细化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011622/

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