Typescript TS属性没有';在泛型定义的类型上不存在

Typescript TS属性没有';在泛型定义的类型上不存在,typescript,typescript-generics,Typescript,Typescript Generics,我有一个类型Columns,其中包含用于呈现表的信息: export type Columns = { header: React.ReactNode; cellContent: <T>(content: T, rowIndex: number) => React.ReactNode; ... } 但是,我得到一个错误,即类型“设备”上不存在属性“title”,但它确实存在,如您在此处所见: export type Equipment = { _entity:

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

export type Columns = {
  header: React.ReactNode;
  cellContent: <T>(content: T, rowIndex: number) => React.ReactNode;
  ...
}
但是,我得到一个错误,即类型“设备”上不存在属性“title”,但它确实存在,如您在此处所见:

export type Equipment = {
  _entity: ResourceType.EQUIPMENT;
  id: number;
  title: string;
  ...
}
我注意到设备类型的导入在VS代码中是灰色的,事实上,如果我删除导入,我不会抱怨设备类型不存在,因此很明显我定义了错误的内容,并且以某种方式为设备创建了“本地范围类型”

在制作我的columns数组时,我需要做什么才能使content参数成为通用的,并由
cellContent
键指定

我尝试过谷歌搜索,但没有找到任何关于这方面的信息


编辑:此处提供的沙盒()反映了下面的评论,但仍然存在问题

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

  • 直接说T将是设备基类。这不是最好的选择,因为你失去了灵活性
从“/Equipment”导入{Equipment};
类型列={
标题:字符串;
cellContent:(内容:T,行索引:number)=>字符串;
};
常量列:列[]=[
{
标题:“站点名称”,
cellContent:(设备:设备,行索引:编号)=>{
返回设备名称;
}
}
];
  • 将T作为泛型添加到类型中,从我的角度来看,这要好得多:
类型列={
标题:字符串;
cellContent:(内容:T,行索引:number)=>字符串;
};
常量列:列[]=[
{
标题:“站点名称”,
cellContent:(设备:设备,行索引:编号)=>{
返回设备名称;
}
}
];

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

  • 直接说T将是设备基类。这不是最好的选择,因为你失去了灵活性
从“/Equipment”导入{Equipment};
类型列={
标题:字符串;
cellContent:(内容:T,行索引:number)=>字符串;
};
常量列:列[]=[
{
标题:“站点名称”,
cellContent:(设备:设备,行索引:编号)=>{
返回设备名称;
}
}
];
  • 将T作为泛型添加到类型中,从我的角度来看,这要好得多:
类型列={
标题:字符串;
cellContent:(内容:T,行索引:number)=>字符串;
};
常量列:列[]=[
{
标题:“站点名称”,
cellContent:(设备:设备,行索引:编号)=>{
返回设备名称;
}
}
];

这看起来不太像一个,但它看起来像是您的
cellContent
函数将
Equipment
声明为一个类型参数,因此它从外部隐藏类型名称
Equipment
。你不想那样做。也许你的意思是
设备:T
,但我不确定,因为示例代码不适合我在IDE中测试。@jcalz我创建了一些您可以在这里查看的东西-。对不起,我想说得简短些,但我可以从一开始就这样做。我尝试了你的建议,它解决了我的阴影问题,但仍然有一个错误,我还没有想出如何解决。任何进一步的指导都会让人难以置信地感激。这看起来不像是一个问题,但它看起来像是您的
cellContent
函数将
Equipment
声明为一个类型参数,因此它从外部隐藏了类型名
Equipment
。你不想那样做。也许你的意思是
设备:T
,但我不确定,因为示例代码不适合我在IDE中测试。@jcalz我创建了一些您可以在这里查看的东西-。对不起,我想说得简短些,但我可以从一开始就这样做。我尝试了你的建议,它解决了我的阴影问题,但仍然有一个错误,我还没有想出如何解决。任何进一步的指导都会让人难以置信地感激。呃,我一直专注于试图改变我所拥有的东西,以至于我完全没有退后一步,意识到我可以/应该通过专栏传递泛型。非常感谢你!!呃,我一直专注于试图改变我所拥有的,以至于我完全没有退后一步,意识到我可以/应该通过列传递泛型。非常感谢你!!
export type Equipment = {
  _entity: ResourceType.EQUIPMENT;
  id: number;
  title: string;
  ...
}
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;
    }
  }
];
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;
    }
  }
];