Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何从映射返回强类型值<;字符串,对象>;方法_Typescript - Fatal编程技术网

Typescript 如何从映射返回强类型值<;字符串,对象>;方法

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

我在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 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
         }
    }
}