【问题标题】:TypeScript, undefined value to concreteTypeScript,具体的未定义值
【发布时间】:2021-02-10 09:24:04
【问题描述】:

如何从可能未定义的值中获取可以分配给状态的值?我知道数据在那里,但我无法通过先检查来禁用打字稿错误。

我正在尝试将 staleModes 置于状态,以便我可以为每个项目呈现控件:

const temps = useSelector((state: RootState) => selectTemps(selectSlss(state)));

const proposedStates = temps?.proposedStates;

const staleModes = proposedStates?.map(a => a.stale.mode);

const [proposedListStale, setProposedListStale] = useState<string[]>(staleModes);

它在这里抱怨 staleModes:useState(staleModes);

错误是: '(string | undefined)[] | 类型的参数undefined' 不能分配给'string[] 类型的参数 | (() => 字符串[])'。 类型 'undefined' 不能分配给类型 'string[] | (() => 字符串[])'。

【问题讨论】:

    标签: javascript reactjs typescript react-hooks


    【解决方案1】:

    可选的链接可能导致staleModes 被分配undefined。如果你真的需要可选链,因为属性可能不存在,你可以用空数组替换。

    由于mode 也可能是undefined,因此将其替换为空字符串:

    const staleModes = proposedStates?.map(a => a.stale.mode ?? '') ?? [];
    

    但如果您确定属性和数据存在,则删除可选链接并改用类型断言:

    const temps = useSelector((state: RootState) => selectTemps(selectSlss(state)))!;
    
    const staleModes = temps.proposedStates!.map(a => a.stale.mode);
    

    【讨论】:

    • 可选链接是我可以分配建议状态的唯一方法。它要求它不要说 temps 可能为空。这些方法都没有改变 staleModes 的类型,它仍然是 const storeModels: (string | undefined)[] 并且不能在 "useState(staleModes)" 中分配
    • 您确定.mode 属性包含字符串,而不是undefined
    • 模式可以是未定义的:(属性)BaseReComponent.mode?:字符串| undefined 我能以某种方式将默认值分配给空字符串吗?
    • 是的,您可以在.mapa.stale.mode ?? ''中使用相同的技术
    • 谢谢!我没见过这种技术。我是一位老开发人员,正在使用 typescript 学习 React,这很痛苦。
    猜你喜欢
    • 2021-11-08
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2016-12-14
    • 2021-06-14
    • 2017-09-14
    相关资源
    最近更新 更多