代码之家  ›  专栏  ›  技术社区  ›  Imnotapotato

是否可以更改子变量的类型(使用typescript)?有什么替代方案?

  •  0
  • Imnotapotato  · 技术社区  · 5 年前

    我有一个正在使用的界面:

    export interface NPMPackage {
      name: string;
      description: string;
      'dist-tags': {
        [tag: string]: string;
      };
      versions: {
        [version: string]: {
          name: string;
          version: string;
          dependencies?: {
            [packageName: string]: string;
          };
        };
      };
    }
    

    这是我的代码:

    let dependencies =  npmPackage.versions[version].dependencies;
    dependencies = Object.entries(dependencies).map( ([name, version]) => ({
        name,
        version: version.replace(/[^\w\s]/gi, ''),
    }));
    

    返回以下错误:

    类型“{name:string;version:string;}[]”不可分配给类型 “{[packageName:string]:string;}”。中缺少索引签名 类型“{name:string;版本:string;}[]”。

    没有与此调用匹配的重载。重载第1个,共2个,'(o:{[s:string]: 一串ArrayLike):[string,string][]',给出了 以下错误。 类型为“{[packageName:string]:string;}| undefined”的参数不可分配给类型为“{[s:string]:string!}”的参数| ArrayLike’。 类型“undefined”不可分配给类型“{[s:string]:string;}|ArrayLike”。重载第2个,共2个,'(o:{}):[string, any][]',给出了以下错误。 类型为“{[packageName:string]:string;}| undefined”的参数不可分配给类型为“{}”的参数。 类型“undefined”不可分配给类型“{}”。

    没有 dependencies 函数,它工作时没有错误。

    如果我加上 dependencies:any 并更改 versions 变量,而不进行如下操作:

        let dependencies =  npmPackage.versions[version].dependencies;
        // lets make it pretty. 
        dependencies = Object.entries(dependencies).map( ([name, version]) => ({
            name,
            version,
        }));
    

    它是有效的。

    基本上,我要做的是添加dependencies方法来更改对象的结构。对象的结构被传递给新变量 依赖项 .对于这些使用typescript的情况,正确的解决方案是什么?这被认为是打字提示时的好做法吗?

    api按描述返回数据,但我想用不同的结构发送给react前端应用程序。

    而且我不明白的是,变量是接口中所说的字符串,为什么它不起作用呢?

    reproducible

    0 回复  |  直到 5 年前
        1
  •  1
  •   Bergi    5 年前

    我想改变我的对象的结构。对象的结构被传递给新变量 dependencies .

    不,不是。您正在将其分配给 老的 变量 依赖项 ,被推断为具有旧结构作为其类型。

    对于这些使用typescript的情况,正确的解决方案是什么?

    对具有不同结构的不同对象使用两个不同的变量。一个是将字符串映射到字符串的对象,另一个是对象数组。所以写

    const dependenciesObj = npmPackage.versions[version].dependencies;
    // lets make it pretty. 
    const dependenciesArr = Object.entries(dependencies).map( ([name, version]) => ({
        name,
        version,
    }));
    
    推荐文章