欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

首次安装使用typescript报错

程序员文章站 2024-03-25 11:49:52
...

最近想学typescript,用npm命令

npm install -g typescript

安装后,运行

tsc -v

想查看版本检测是否安装成功,随后报错了首次安装使用typescript报错
看得我一脸懵逼。网上也查不到任何信息。
没办法只好看代码。
打开tsc.js文件,看到报错源头5970行,是这么一句,

    var textToKeyword = new ts.Map(ts.getEntries(textToKeywordObj));

把textToKeywordObj和ts.getEntries的返回值分别用console.log输出后,
得知textToKeywordObj是这么一个对象,

{ abstract:
  any: 128,
  as: 126,
  asserts: 1
  bigint: 15
  boolean: 1
  break: 80,
  case: 81,
  catch: 82,
  class: 83,
  continue:
  const: 84,
  constructo
  debugger:
  declare: 1
  default: 8
  delete: 88
  do: 89,
  else: 90,
  enum: 91,
  export: 92
  extends: 9
  false: 94,
  finally: 9
  for: 96,
  from: 152,
  function:
  get: 134,
  if: 98,
  implements
  import: 99
  in: 100,
  infer: 135
  instanceof
  interface:
  is: 136,
  keyof: 137
  let: 118,
  module: 13
  namespace:
  never: 140
  new: 102,
  null: 103,
  number: 14
  object: 14
  package: 1
  private: 1
  protected:
  public: 12
  readonly:
  require: 1
  global: 15
  return: 10
  set: 145,
  static: 12
  string: 14
  super: 105
  switch: 10
  symbol: 14
  this: 107,
  throw: 108
  true: 109,
  try: 110,
  type: 148,
  typeof: 11
  undefined:
  unique: 15
  unknown: 1
  var: 112,
  void: 113,
  while: 114
  with: 115,
  yield: 124
  async: 129
  await: 130
  of: 155 }

entry为一个数组:(entry为ts.getEntries返回值)

[ ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  [ 'abstract', 12
  [ 'any', 128 ],
  [ 'as', 126 ],
  [ 'asserts', 127
  [ 'bigint', 154
  [ 'boolean', 131
  [ 'break', 80 ],
  [ 'case', 81 ],
  [ 'catch', 82 ],
  [ 'class', 83 ],
  [ 'continue', 85
  [ 'const', 84 ],
  [ 'constructor',
  [ 'debugger', 86
  [ 'declare', 133
  [ 'default', 87
  [ 'delete', 88 ]
  [ 'do', 89 ],
  [ 'else', 90 ],
  [ 'enum', 91 ],
  [ 'export', 92 ]
  [ 'extends', 93
  [ 'false', 94 ],
  [ 'finally', 95
  [ 'for', 96 ],
  [ 'from', 152 ],
  [ 'function', 97
  [ 'get', 134 ],
  [ 'if', 98 ],
  [ 'implements',
  [ 'import', 99 ]
  [ 'in', 100 ],
  [ 'infer', 135 ]
  [ 'instanceof',
  [ 'interface', 1
  [ 'is', 136 ],
  [ 'keyof', 137 ]
  [ 'let', 118 ],
  [ 'module', 138
  [ 'namespace', 1
  [ 'never', 140 ]
  [ 'new', 102 ],
  [ 'null', 103 ],
  [ 'number', 143
  [ 'object', 144
  [ 'package', 119
  [ 'private', 120
  [ 'protected', 1
  [ 'public', 122
  [ 'readonly', 14
  [ 'require', 142
  [ 'global', 153
  [ 'return', 104
  [ 'set', 145 ],
  [ 'static', 123
  [ 'string', 146
  [ 'super', 105 ]
  [ 'switch', 106
  [ 'symbol', 147
  [ 'this', 107 ],
  [ 'throw', 108 ]
  [ 'true', 109 ],
  [ 'try', 110 ],
  [ 'type', 148 ],
  [ 'typeof', 111
  [ 'undefined', 1
  [ 'unique', 150
  [ 'unknown', 151
  [ 'var', 112 ],
  [ 'void', 113 ],
  [ 'while', 114 ]
  [ 'with', 115 ],
  [ 'yield', 124 ]
  [ 'async', 129 ]
  [ 'await', 130 ]
  [ 'of', 155 ] ]

网上搜了下Iterator value undefined is not an entry object,查到这么一篇博客,ES6语法,里面有这么一句,
首次安装使用typescript报错
用数组创建Map结构数组必须为二维数组,否则会报这个错Iterator value 1 is not an entry object。和上面的错误很像。
很明显上面的那段代码也是想用数组创建一个Map结构,但是参数非法,所以报错了。数组中有大量的空成员,导致输出大量逗号,也使这个数组不为二维数组。
为什么会输出大量空成员呢,我又看了下ts.getEntries函数,

    var _entries = Object.entries ? Object.entries : function (obj) {
        var keys = getOwnKeys(obj);
        var result = Array(keys.length);
        for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
            var key = keys_1[_i];
            result.push([key, obj[key]]);
        }
        return result;
    };
    function getEntries(obj) {
        return obj ? _entries(obj) : [];
    }
    ts.getEntries = getEntries;

里面出问题的一段代码是

        var result = Array(keys.length);
        for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
            var key = keys_1[_i];
            result.push([key, obj[key]]);
        }

他创建了一个keys.length大小的数组,然后再往后面添加成员,这导致前面有大量空的成员,最后得到的数组大小为2*keys.length。
可以这么改:

        var result = [];
        for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
            var key = keys_1[_i];
            result.push([key, obj[key]]);
        }
        return result;

最后运行成功了。
首次安装使用typescript报错
不知道为什么会遇到这种问题。我用的typescript是4.0.2。node版本是4.6.2。有知道原因的请跟我说下

相关标签: 编译运行错误