【发布时间】:2018-11-23 04:12:33
【问题描述】:
有没有办法从属于接口的对象中动态提取成员(即不再明确指定它们),如下所示:
let subset = { ...someObject as ISpecific };
目前我得到了 someObject 碰巧拥有的所有成员。 所以扩展运算符在这里不起作用。有没有办法做到这一点?
例子:
interface ISpecific { A: string; B: string; }
class Extended implements ISpecific { public A: string = '1'; public B: string = '2'; public C: string = '3'; }
let someObject = new Extended();
let subset = { ...someObject as ISpecific };
console.log(subset); // -> { A, B, C } but want { A, B }
TypeScript 转换只是对编译器的提示,而不是运行时的真正转换。
【问题讨论】:
-
someObject包含更多字段,您只想提取ISpecific中的字段? -
是的,我刚刚找到了解决方案,见下文。
-
由于缺乏反射或语言级别的支持,TypeScript 中还没有解决方案。必须明确指定要包含的成员(或指定要在破坏模式中丢弃的成员)。
-
目前这在 TypeScript 中是不可能的,而且可能永远不会。 design goals 将以下内容视为非目标:5。在程序中添加或依赖运行时类型信息,或根据类型系统的结果发出不同的代码。相反,鼓励不需要运行时元数据的编程模式。 您必须制定一个在运行时有效的解决方案。至少如果为该解决方案使用映射类型,如果输出与您的接口不兼容,编译器仍会报告错误。
标签: typescript