class 上的 Typescript 通用约束

Typescript generic constraint on class

我正在尝试制作一个非常简单的本地存储实用程序方法。我想根据一个key(当然)和指定的类型得到一个entry

代码如下:

get<T>(key: string): T {
  const data = localStorage.getItem(key);
  const object = JSON.parse(data) as T;
  if (!object) {
    throw new Error(`Casting ${JSON.stringify(data)} is impossible`);
  }
  return object;
}

如您所知,转换 as T 效率不够高。 例如,如果我在 Local Storage 中的条目是 <'key', 10>,则: get<NoMatterTheClass>('key') 将 return 10 作为数字,不会抛出错误。

所以我的问题是:我怎样才能确保转换是可能的? 通用约束?我试过 <T extends (new() => T)> 但它不起作用

感谢您的帮助!

这是不可能的。 as T 是一个类型断言,如果类型不匹配就会抛出错误。但是,类型检查仅发生在开发时,而不是 运行 时。因此,JSON.parse(data) as T; 不会将 JSON.parse(data) 转换为 T。它只是告诉编译器 JSON.parse(data)T 因为当您将 as T 分配给该值时您非常确定这一点。所以 TypeScript 无法做到这一点。只能用Javascript来查看。