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
来查看。
我正在尝试制作一个非常简单的本地存储实用程序方法。我想根据一个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
来查看。