Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >对于可能是也可能不是分层的泛型T,使用什么类型声明?

对于可能是也可能不是分层的泛型T,使用什么类型声明?
EN

Stack Overflow用户
提问于 2018-06-01 01:23:24
回答 1查看 77关注 0票数 4

我正在扩展一个React表(创造性地称为" table "),它接受一个通用数据数组,以及一些列配置数据,并呈现一个表。声明如下所示:

代码语言:javascript
代码运行次数:0
复制
export class Table<T> extends React.Component<TableProps<T>, any>

TableProps的非可选部分:

代码语言:javascript
代码运行次数:0
复制
export interface TableProps<T> {
    columnConfigs: TableColumnConfig<T>;
    tableStore: TableStore<T>;
}

并且TableStore只有一个必需的属性:

代码语言:javascript
代码运行次数:0
复制
export class TableStore<T> {
    public data: T[];
}

TableColumnConfigs不是特别重要,因为T只用在可选属性中:

代码语言:javascript
代码运行次数:0
复制
export interface TableColumnConfigs<T> {
    render?: (data: T) => JSX.Element
}

这已经在几个地方使用过了,我正在给它添加一个功能:可选的分层数据,这样我们就可以停止使用Kendo's TreeList (它非常非常有功能,但是在我们的环境中加载有点慢)。

我的问题:我想声明T,表中使用的数据类型,由类之外的人提供,可能有一个特定的属性,使该类型具有递归子类型,但不是必需的。

我试过了:

代码语言:javascript
代码运行次数:0
复制
export interface ChildData<T> {
    children?: (T & ChildData<T>)[]
}
export class Table<T extends ChildData<T>> extends React.Component<TableProps<T>, any> ...

这是行不通的,因为外部类没有定义一个叫做“孩子”的属性。

问题是Table2.8不喜欢它:当我在某个地方实际使用TypeScript时,它抱怨T没有实现ChildData。(我现在正在使用TS2.3编译,但我会在某个时候升级到2.4以上,真的,我发誓。最终会的。无论如何,我绝对不想被阻止升级。我知道它不能在2.8上工作,因为我的IDE使用2.8运行Intellisense,但我运行的是2.3编译器。)

我也尝试过使用联合和交集类型声明,但它们根本不能编译,即使在TS2.3下也是如此:

代码语言:javascript
代码运行次数:0
复制
export class Table<T & ChildData<T>> extends React.Component<TableProps<T>, any> ...
export class Table<T | ChildData<T>> extends React.Component<TableProps<T>, any> ...

有没有办法说“我有一个泛型参数T,它可以实现一个ChildData,但不是必须的”?我的组件已经在其他几个地方被使用了,而且它将被不是我的人使用。我不想要求表的消费者也通过一个他们不使用的“孩子”属性来扩展他们的T类型(因为表的分层特性是完全可选的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 20:52:18

经过一番摸索之后,我终于意识到数据只在一个地方很重要:在TableStore的“ChildData”属性中,这是所有相关数据所在的地方。所以我重新定义了TableStore:

代码语言:javascript
代码运行次数:0
复制
export class TableStore<T> {
    public data: (T & ChildData<T>)[];
    constructor(input: T[]) { this.data = input; }
}

显然,您不能在泛型参数中使用&和|,但可以使用“扩展”。而且,如果您一直传递泛型参数,TypeScript最终会失去对泛型细节的跟踪。在类中使用T并在属性中使用(T & somethingElse)的行为,允许我直接将T赋给(T & somethingElse)。

我假设,就像TypeScript 2.4收紧泛型一样,TypeScript的未来版本将不允许我目前逃脱惩罚的恶作剧。

请注意,这个实现有点不可靠,因为我必须在内部的几个地方以及在生成TableStore的数据时在消费类中强制转换为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50634863

复制
相关文章
配置PDB符号文件服务
刚入职的小木,前不久刚刚解决了一次crash问题《Windbg分析程序崩溃实践》。小木没有松懈,继续进行项目代码和Debug技术的学习,同时也思考了一个问题“产品每隔一段时间就会发布新的版本,当出现Crash问题的时候得手动去拷贝响应版本的pdb文件到本机进行调试,有没有什么方式可以实现自动化呢?” 嗯,小木是一个合格的程序员,程序员就是致力于让重复的工作自动化。
河边一枝柳
2021/08/06
5330
VS配置PCL“无法解析外部符号”
报错说明可能出现在vtk 和pcl_visualization 的lib上。在依赖库中添加pcl_visualization.lib 或者在.cmake文件中添加visualization重新编译,如下:
全栈程序员站长
2022/09/13
1.7K0
VS配置PCL“无法解析外部符号”
VS2015无法解析外部符号
大家好,又见面了,我是你们的朋友全栈君。 在使用VS编辑C++时,遇到了无法解析外部符号的错误 严重性 代码 说明 项目 文件 行 错误 LNK2019 无法解析的外部符号 “public: __t
全栈程序员站长
2022/09/13
4.9K0
vs2010 lnk2019无法解析的外部命令_vs无法解析的外部符号
最近在研究sumo,前几天将编译环境都搭建好了后,自己在解决方案的基础上新增加了一个项目,但是突然冒出来好多问题,其他都已经通过网络搜索解决。关于错误:error LNK2019 :无法解析的外部符号。网络方法很多,自己按照各种方法测试后依然不能解决。最后想到,和已经编译好的项目配置一项一项的作对比,来看看到底哪里出错了。因为根据错误提示,是两个cpp文件中的函数定义被引用。
全栈程序员站长
2022/11/10
2.1K0
vs2010 lnk2019无法解析的外部命令_vs无法解析的外部符号
PDB 文件
PDB (Program Data Base) 即程序的基本数据,是 VS 编译链接时生成的文件,每个程序集(EXE 或 DLL)都有一个与之对应的 PDB 文件。DPB 文件主要存储了 VS 调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、对应的行号等等。因为存储的是调试信息,所以一般情况下 PDB 文件是在 Debug 模式下才会生成。有了这个文件,我们才能对程序进行 断点调试 ,才能一步步执行程序。
全栈程序员站长
2022/09/05
1K0
PDB 文件
未加载mscorlib.pdb
  早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug!
追逐时光者
2020/06/19
1.3K0
未加载mscorlib.pdb
c# pdb文件_pdb文件是什么
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
1.1K0
PDB文件详解
PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。
全栈程序员站长
2022/09/05
2.1K0
PDB文件详解
VS无法打开源文件
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148364.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/02
2.2K0
动态加载JS文件
const scriptEl = document.createElement('script'); scriptEl.onload = scriptEl.onreadystateschange = function () { if (!this.readyState // FF onload || this.readyState == 'loaded' || this.readyState == 'complete' // IE onreadystateschange ) {
路过君
2021/12/07
20.4K0
Js文件异步加载
浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速较差的环境下可能会出现浏览器页面假死的情况,这也就是尽量将<script>文件放置于<body>后的原因,Js文件异步加载就是使浏览器加载外部Js脚本文件时不阻塞渲染线程,这称为非阻塞模式加载,当然加载完成之后解析执行Js脚本时必须与渲染引擎互斥,解析执行Js脚本的时机取决于异步加载Js的方式。
WindRunnerMax
2020/08/27
10.4K0
VS开发中遇到无法解析外部符号问题(LNK错误)
在VS开发中,很容易遇到外部符号无法解析的问题,而这些问题大部分都是引用库失败导致的,只需正确的加载到了库,这类问题就可以解决了 但也存在非库的原因,比如编码问题 关于VS编码格式以及VS修改行尾编码格式
全栈程序员站长
2022/09/07
1.8K0
VS开发中遇到无法解析外部符号问题(LNK错误)
处理pdb文件
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137318.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/05
3760
PDB文件说明
PDB文件里面的每个记录都有着严格的格式. 每个记录中的字段, 如标识, 原子名称, 原子序号, 残基名称, 残基序号等, 不仅要按照严格的顺序书写, 而且每个字段所占的字符串长度, 及其所处的位置都是严格规定好的. 这些记录中, 通常最关心的是原子记录, 其详细说明可参考PDB原子记录官方文档.
全栈程序员站长
2022/09/05
1.8K0
关于pdb文件
当程序在 VS 上编译时,程序所依赖的所有动态链接库(dll 文件)也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含 dll 库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等。当使用VS 调试程序时,会默认加载你的程序以及程序依赖的dll库产生的所有pdb文件,但是结果往往是VS自己找不到依赖库的pdb文件,于是就提示给你“无法查找或打开pdb文件“。
全栈程序员站长
2022/09/05
4260
qt5的.ui文件在VS2010中无法编译问题
自己手动添加的.ui文件在VS中是无法右键编译的,也即是说,在用QT designer编辑过的.ui文件无法实时更新相应的ui_XX.h文件,造成调试结果无法显示编辑过的新界面。
jianghaibobo
2019/09/11
2.7K0
VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”[通俗易懂]
上一篇文章中,为了编译OpenCV的示例代码,然后搭建环境, 最后想直接运行示例demo,我在创建新工程的时候,直接创建了一个win32窗口项目,然后环境配置完成后,将opencv 的示例代码kalman.cpp直接导入到新建的vs工程中进行编译,直接报错:
全栈程序员站长
2022/11/08
1.3K0
VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”[通俗易懂]
VisualStudio 2019 调试项目使用 Portable PDB 提示不支持 PDB 格式
在新的 .NET 上,将会默认使用 Portable PDB 符号格式,而如果 VisualStudio 配置了使用托管兼容模式,那么将在加载符号的时候,将会提示不支持 PDB 格式
林德熙
2022/08/12
7780
laravel 预加载特定的列
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112351.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
7070
laravel 预加载特定的列
修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹
本文告诉大家如何修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹的问题。如果 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹,那将会在调试的时候,由于找不到 PDB 符号文件而加载符号失败
林德熙
2022/08/12
1.2K0

相似问题

无法加载PDB符号(igvk32.pdb未加载)

13

OpenCV符号已加载,无法打开PDB文件错误

11

VS代码“无法找到或打开PDB文件”,即使pdb存在并加载其他csproj pdb文件也是如此

226

未加载任何符号,pdb文件丢失

60

VS 2010不加载PDB

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文