Typescript 如何从映射返回强类型值<;字符串,对象>;方法
我在C#工作了很长时间,最近开始使用TypeScript V3.1.6开发Node.js项目。我很困惑,Typescript现在支持泛型,这是我预期从C#过渡到C#会失去的东西之一 我的C#代码是一个DataRow包装器,允许我使用泛型从字典中提取强类型值,如下所示:Typescript 如何从映射返回强类型值<;字符串,对象>;方法,typescript,Typescript,我在C#工作了很长时间,最近开始使用TypeScript V3.1.6开发Node.js项目。我很困惑,Typescript现在支持泛型,这是我预期从C#过渡到C#会失去的东西之一 我的C#代码是一个DataRow包装器,允许我使用泛型从字典中提取强类型值,如下所示: Dictionary<string, object> Values = new Dictionary<string, object>(); public T Parse<T>(string co
Dictionary<string, object> Values = new Dictionary<string, object>();
public T Parse<T>(string columnName)
{
T result = default(T);
result = (T)Convert.ChangeType(this.Values[columnName], typeof(T));
return result;
}
export class DataRow {
private Values: Map<string, object> = new Map<string, object>();
constructor(row?: any) {
if (!!row) {
for (let key in row) {
this.Values.set(key, row[key]);
}
}
}
public Value<T>(key: string): T {
//Not exactly how to replicate the return.
}
}
允许我在值为null时返回类型的默认值。为了简洁起见,我从C#示例中删除了其他几个空检查和字典检查。我的主要想法/问题是:
1) 您能在Typescript中获得泛型的默认类型吗
2) 由于我是TypeScript新手,请随时指出迄今为止我的TypeScript代码存在的任何明显问题
3) 返回强类型值是否会影响Node.js中的性能
更新:
我已将我的类更新为:
export class DataRow {
private Values = new Map<string, any>();
constructor(row?: any) {
if (!!row) {
for (let key in row) {
this.Values.set(key, row[key]);
}
}
}
public Value<T>(key: string): T {
if (this.Values.has(key)) {
let value = this.Values.get(key);
if (!!value) {
return value as T;
}
}
return <unknown>null as T;
}
}
导出类数据行{
私有值=新映射();
构造函数(行?:任意){
如果(!!行){
for(让键输入行){
this.Values.set(key,row[key]);
}
}
}
公共值(键:字符串):T{
if(this.Values.has(key)){
让value=this.Values.get(key);
如果(!!值){
返回值为T;
}
}
返回null作为T;
}
}
现在效果很好。谢谢你的帮助 TypeScript只在构建时提供静态键入的好处。在应用程序可以在NodeJS环境中执行之前,您的代码将被编译成JavaScript,因此您不必担心返回任何强类型的内容,也不必担心性能,因为在运行时应用程序中根本没有TS 至于您关于默认值的问题,您可以简单地检查映射中是否存在该值,如果没有,则返回默认值
public Value<T>(key: string): T {
if (this.Values.has(key) {
return this.Values.get(key)
} else {
// return some kind of default.
}
}
公共值(键:字符串):T{
if(this.Values.has)(键){
返回此.Values.get(键)
}否则{
//返回某种默认值。
}
}
关于可能的改进,我建议您将类转换为泛型以提高类型安全性
// Class is now a generic with a default type of `object`.
export class DataRow<T = object> {
// You don't need to explicitly type the Values. TS can infer that.
private Values = new Map<string, T>();
// Explicitly type the row argument for type safety.
constructor(row?: { [key: string]: T }) {
// In JS/TS land you don't have to explicitly cast
// values to booleans to be able to make a truth check.
if (row) {
for (let key in row) {
this.Values.set(key, row[key]);
}
}
}
public Value(key: string): T {
if (this.Values.has(key)) {
return this.Values.get(key)
} else {
// return some kind of a default
}
}
}
//类现在是一个泛型,默认类型为“object”。
导出类数据行{
//您不需要显式地键入值。TS可以推断出这一点。
私有值=新映射();
//显式键入类型安全性的行参数。
构造函数(行?:{[key:string]:T}){
//在JS/tsland中,您不必显式地强制转换
//将值转换为布尔值,以便能够进行真理检查。
国际单项体育联合会(世界其他地区){
for(让键输入行){
this.Values.set(key,row[key]);
}
}
}
公共值(键:字符串):T{
if(this.Values.has(key)){
返回此.Values.get(键)
}否则{
//返回某种默认值
}
}
}
Mateusz Kocz-感谢您抽出时间回答我的问题并提供一些提示。我确实有一些后续问题要问您。1.返回此。value.get(key)在我的IDE a(TS)中给我两个警告类型“object | undefined”不可分配给类型“T”b。类型“undefined”不可分配给类型“T”。这很可能是因为我正在运行更严格的配置选项,如这里所述:关于您的注释“在JS/TS领域中,您不必显式地将值强制转换为布尔值以进行真理检查”-我是根据下面描述“双重爆炸”的文章来使用它的这里的示例:-我知道TypeScript自最初发布以来已经有了很大的发展,因此了解您是否可以避免会很有帮助!!现在在V3.1.6及更高版本中一起使用!!再次感谢您的帮助!关于这两个警告,发生这种情况是因为TS无法确保将从映射返回的值确实存在答案是键入返回值。这是安全的,因为您正在使用值.has
检查是否存在。只需编写返回此.Values.get(键)正如T
完美。事实上,我昨天偶然发现了修复程序,但直到今天早上才开始更新。非常感谢你的帮助。我用最终版本更新了我的原始答案。最好!
// Class is now a generic with a default type of `object`.
export class DataRow<T = object> {
// You don't need to explicitly type the Values. TS can infer that.
private Values = new Map<string, T>();
// Explicitly type the row argument for type safety.
constructor(row?: { [key: string]: T }) {
// In JS/TS land you don't have to explicitly cast
// values to booleans to be able to make a truth check.
if (row) {
for (let key in row) {
this.Values.set(key, row[key]);
}
}
}
public Value(key: string): T {
if (this.Values.has(key)) {
return this.Values.get(key)
} else {
// return some kind of a default
}
}
}