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
实例。是否有一种方法可以在运行时检测泛型参数是否具有and
id
属性?

如果没有代码,这里就没有太多东西可以做了

表面上看:不,您不可能在运行时分析泛型类型参数,因为类型系统是。在运行时,您只能分析运行时值,例如传递给构造函数的实际对象。在编译时,您可能会让编译器根据泛型类型参数为
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!