【问题标题】:TS property doesn't exist on type defined by genericTS 属性在泛型定义的类型上不存在
【发布时间】:2019-11-21 05:40:08
【问题描述】:

我有一个类型 Columns,其中包含用于呈现表格的信息:

export type Columns = {
  header: React.ReactNode;
  cellContent: <T>(content: T, rowIndex: number) => React.ReactNode;
  ...
}

然后我在一个将要呈现一些数据的组件中定义一个Columns[] 数组。您可以在此处查看示例:

{
  header: 'Site name',
  cellContent: <Equipment,>(equipment: Equipment, rowIndex: number) => {
    return (
      <div className={styles.equipmentNameContainer}>{equipment.title}</div>
    );
  },
},

但是,我收到一个错误,即“设备”类型上不存在属性“标题”,但正如您在此处看到的那样:

export type Equipment = {
  _entity: ResourceType.EQUIPMENT;
  id: number;
  title: string;
  ...
}

我注意到设备类型的导入在 VS Code 中是灰色的,事实上,如果我删除导入,我不会抱怨设备类型不存在,所以很明显我定义了一些错误并且以某种方式创建了一个“本地设备的作用域类型'。

在制作我的列数组时,我需要做什么才能使内容参数通用并由cellContent 键指定?

我试过谷歌搜索,但没有找到任何相关信息

编辑:此处提供的沙盒 (https://codesandbox.io/s/typescript-playground-export-ibhf7?fontsize=14&hidenavigation=1&theme=dark) 反映了以下评论但仍有问题

【问题讨论】:

  • 这看起来不太像minimal reproducible example,但看起来您的cellContent 函数将Equipment 声明为generic 类型参数,因此它隐藏了类型名称Equipment从外面。你不想那样做。也许您的意思是 &lt;T extends Equipment&gt;equipment: T,但我不确定,因为示例代码不适合我在 IDE 中测试。
  • @jcalz 我创建了一些您可以在此处查看的内容 - codesandbox.io/s/…。抱歉,我试图保持简短,但我可以从一开始就做到这一点。我尝试了您的建议,它解决了我的阴影问题,但仍然有一个错误,我还没有弄清楚如何解决。任何进一步的指导将不胜感激

标签: typescript typescript-generics


【解决方案1】:

您可以通过以下方式解决此问题:

  • 直接说TS T就是Equipment基类。不是最佳选择,因为您失去了灵活性。
import { Equipment } from "./Equipment";

type Columns = {
  header: string;
  cellContent: <T extends Equipment>(content: T, rowIndex: number) => string;
};

const columns: Columns[] = [
  {
    header: "Site name",
    cellContent: (equipment: Equipment, rowIndex: number) => {
      return equipment.title;
    }
  }
];
  • 将 T 作为泛型添加到 Type,这在我看来要好得多:
type Columns<T> = {
  header: string;
  cellContent: (content: T, rowIndex: number) => string;
};

const columns: Columns<Equipment>[] = [
  {
    header: "Site name",
    cellContent: (equipment: Equipment, rowIndex: number) => {
      return equipment.title;
    }
  }
];

【讨论】:

  • 呃,我一直专注于尝试改变我所拥有的东西,以至于我完全没有退后一步并意识到我可以/应该通过列传递泛型。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 2020-11-07
  • 2021-01-11
  • 2021-01-10
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多