Javascript 检测泛型类型参数是否具有id属性?
我正在设计一个通用的Javascript 检测泛型类型参数是否具有id属性?,javascript,typescript,generics,generic-programming,Javascript,Typescript,Generics,Generic Programming,我正在设计一个通用的Slice类,它表示一组实例的一个实例片段。例如,如果我们有Todo实例,那么切片可以表示所有已完成的实例 如果Todo类具有id属性,我们希望在Slice实例上将hasID设置为true,这样我们也可以通过id索引Slice实例。是否有一种方法可以在运行时检测泛型参数是否具有andid属性?如果没有代码,这里就没有太多东西可以做了 表面上看:不,您不可能在运行时分析泛型类型参数,因为类型系统是。在运行时,您只能分析运行时值,例如传递给构造函数的实际对象。在编译时,您可能会让
Slice
类,它表示一组实例的一个实例片段。例如,如果我们有Todo
实例,那么切片可以表示所有已完成的实例
如果
Todo
类具有id
属性,我们希望在Slice
实例上将hasID
设置为true
,这样我们也可以通过id
索引Slice
实例。是否有一种方法可以在运行时检测泛型参数是否具有andid
属性?如果没有代码,这里就没有太多东西可以做了
表面上看:不,您不可能在运行时分析泛型类型参数,因为类型系统是。在运行时,您只能分析运行时值,例如传递给构造函数的实际对象。在编译时,您可能会让编译器根据泛型类型参数为hasID
指定特定的true
或false
布尔文字类型。您可以同时做这两件事,并希望得到一个解决方案,其中运行时值实际上与编译时类型匹配
让我们试试看。下面是一个可能解决方案的示意图:
class Slice<E> {
instances: E[]
hasID: E extends {id: any} ? true : false;
constructor(firstInstance: E, ...restInstances: E[]) {
this.hasID = 'id' in firstInstance as Slice<E>['hasID'];
this.instances = [firstInstance, ...restInstances];
}
}
看起来不错。不过,您可能需要担心一些边缘情况,例如:
declare const notSure: object;
const oopsie = new Slice(notSure);
oopsie.hasID; // false at compile time, maybe true at runtime!
编译器无法验证对象
是否具有id
属性,因此它会给出hasID
类型false
。但是当然,对象
可能有一个id
属性,因此在运行时,hasID
可能是true
。有办法解决这个问题吗?大概但这并不简单。问题是你遇到这些情况的可能性有多大,以及你是否关心它们
无论如何,希望这是有意义的,并给你一些方向。祝你好运 谢谢-非常好!我在那里学到了一些新技巧。我认为这应该可以很好地工作,因为其思想是Slice用户总是会声明一个带有
id
属性的类型。再次感谢!这是一个开源项目。一旦我对它进行了更多的测试,我将在这里承诺,以防有人想深入了解:
declare const notSure: object;
const oopsie = new Slice(notSure);
oopsie.hasID; // false at compile time, maybe true at runtime!