Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/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
Javascript 如何使用Typescript索引注释性对象_Javascript_Typescript - Fatal编程技术网

Javascript 如何使用Typescript索引注释性对象

Javascript 如何使用Typescript索引注释性对象,javascript,typescript,Javascript,Typescript,所以,这个标题相当准确地概括了它。我正在做的是将一系列函数导入名为“ops.ts”的索引文件中,ops.ts使用“export”语法导出这些函数(下面的代码片段)。然后我从另一个文件导入ops.ts,并动态调用这些函数。一个小问题是,我无法使用字符串键从ops.ts索引对象(我对Typescript不太熟悉,所以我不确定到底出了什么问题)。具体地说,我得到的错误元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型。任何帮助都将不胜感激 以下是相关代码: ops.ts

所以,这个标题相当准确地概括了它。我正在做的是将一系列函数导入名为“ops.ts”的索引文件中,ops.ts使用“
export
”语法导出这些函数(下面的代码片段)。然后我从另一个文件导入
ops.ts
,并动态调用这些函数。一个小问题是,我无法使用字符串键从
ops.ts
索引对象(我对Typescript不太熟悉,所以我不确定到底出了什么问题)。具体地说,我得到的错误
元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型
。任何帮助都将不胜感激

以下是相关代码:

ops.ts

export { default as add } from "./ops/add.ts";
export { default as mult} from "./ops/mult.ts";

这里面有很多东西

  • 根据编译模块的方式,结果JS对象中可以有其他字段。Typescript将不允许您为它们编制索引,但
    Object.keys()
    和其他迭代键的方法将允许。您可能不希望在
    操作
    数组中有
    “\uu esModule”:true
    字段。(检查沙盒中的控制台输出:)
  • Object.keys()
    的类型是通用的。它可以返回ops类型的
    键数组
    ,但为简单起见,它只是
    字符串
    。通常不能使用任意字符串为特定类型的对象编制索引。您必须显式地强制转换它,比如
    operations[key]=ops[key-as-keyof-typeof-ops]
  • 至于如何处理这个问题,我建议将操作作为关联数组导入,这样实际上就不必遍历模块的键。像这样:

    //ops.ts
    import { default as add } from "./add";
    import { default as mult } from "./mult";
    
    export const allOperations = { add, mult }
    
    

    作为一个固执己见的补充,我建议避免TypeScript中的默认导出:

    为什么不简单地这样做。operators=ops?因为当我试图学习新东西时,我作为一名编码员的能力似乎消失了。谢谢你的简单修复,看起来我有点过于复杂了。好的,谢谢你的建议!打字脚本似乎有很多诀窍。
    main.ts
    import * as ops from "./ops.ts"
    class example {
      //irrelavent code
      constructor() {
         Object.keys(ops).forEach((op: string) => {
            this.operators[op] = ops[op];
         });
      }
    }
    
    
    //ops.ts
    import { default as add } from "./add";
    import { default as mult } from "./mult";
    
    export const allOperations = { add, mult }