【问题标题】:Type assignment error in typed reducer callback类型化减速器回调中的类型分配错误
【发布时间】:2020-09-15 17:15:24
【问题描述】:

下面的代码给了我以下类型错误

没有重载匹配这个调用。 重载 1 of 3, '(callbackfn: (previousValue: TestData, currentValue: TestData, currentIndex: number, array: TestData[]) => TestData, initialValue: TestData): TestData',给出以下错误。 类型 'boolean' 不可分配给类型 'TestData'。 重载 2 of 3, '(callbackfn: (previousValue: BooleanObject, currentValue: TestData, currentIndex: number, array: TestData[]) => BooleanObject, initialValue: BooleanObject): BooleanObject',给出以下错误。 类型 'boolean' 不能分配给类型 'BooleanObject'。

有没有人能帮助解释为什么这个类型是不可分配的?

在我看来,在 TestState 接口中,我将属性“booleanObject”定义为 BooleanObject 类型,而 BooleanObject 是一个定义字符串索引属性的接口,这样当使用字符串索引时,返回值的类型应该是布尔值.

然后通过将reducer中的初始值强制转换为BooleanObject类型,

a) reducer 返回状态定义中属性“booleanObject”所期望的正确类型,并且

b) 然后当我索引累加器(类型为 BooleanObject)时,我相信我应该期待累加器 ["index"] 的值是布尔类型

我在哪里无法弄清楚为什么会出现 type not assignable 错误?

提前致谢!

import React from 'react';

interface TestProps {
    data: TestData[];
}

interface TestState {
    booleanObject: BooleanObject;
}

interface BooleanObject {
    [index: string]: boolean;
}

interface TestData {
    name: string;
    subData: SubData[];
}

interface SubData {
    name: string;
    value: string;
}

class Test extends React.Component<TestProps, TestState>{
    constructor(props: TestProps){
        super(props);
        this.state = {
            booleanObject: this.props.data.reduce((accumulator, currentValue) => accumulator[currentValue.name] = false, {} as BooleanObject)
        }
    }
}

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    reduce函数的类型是这样的

    Array<T>.reduce(callbackfn: (previousValue: T, currentValue: T, ..) => T): T
    

    意思是,它的结果是数组元素的类型。

    因此,由于this.props.data 的类型为TestData[]reduce 方法必须返回TestData 类型的结果,而您的代码中并非如此(它会强制转换并返回BooleanObject)。

    【讨论】:

      【解决方案2】:

      您的类型看起来不错。

      基本上,在您的 reduce 中,当您返回 accumulator[currentValue.name] = false; 时,这意味着您返回的是 false(即布尔值),因此会出现问题。

      只需在 reduce 回调中正确返回,您的类型就会得到修复。

      像这样

      import React from "react";
      
      interface TestProps {
        data: TestData[];
      }
      
      interface TestState {
        booleanObject: BooleanObject;
      }
      
      interface BooleanObject {
        [index: string]: boolean;
        //   index: boolean;
      }
      
      interface TestData {
        name: string;
        subData: SubData[];
      }
      
      interface SubData {
        name: string;
        value: string;
      }
      
      class Test extends React.Component<TestProps, TestState> {
        constructor(props: TestProps) {
          super(props);
          this.state = {
            booleanObject: this.props.data.reduce((accumulator, currentValue) => {
              accumulator[currentValue.name] = false;
              return accumulator;
            }, {} as BooleanObject),
          };
        }
      }
      
      

      【讨论】:

      • 我说得对吗,因为我没有在 reducer 回调中显式返回 BooleanObject 类型的对象,它本质上是返回 undefined 被评估为 false/boolean 并试图将其分配给回调 BooleanObject 的预期返回类型?我仍然对javascript如何假设“return accumulator [currentValue.name] = false”返回什么感到困惑?我认为回调会隐式返回累加器对象及其分配的属性和类型?
      • 是的 - 你应该返回一个 BooleanObject ... 这样做return accumulator[currentValue.name] = false" 不会返回对象,它返回 false。您可以通过在浏览器控制台中输入一行简单的代码(例如:a = 2)来检查这一点,您会看到返回 2 .... 使用 javascript reduce ,您必须根据需要执行累积逻辑返回每次迭代的累加器...
      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多