首次安装使用typescript报错

tech2022-09-02  110

最近想学typescript,用npm命令

npm install -g typescript

安装后,运行

tsc -v

想查看版本检测是否安装成功,随后报错了 看得我一脸懵逼。网上也查不到任何信息。 没办法只好看代码。 打开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语法,里面有这么一句, 用数组创建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是4.0.2。node版本是4.6.2。有知道原因的请跟我说下

最新回复(0)