TS错误:类型'string'不是数组类型或字符串类型。怎么一个字符串不是一个字符串?

时间:2019-07-11 13:27:55

标签: typescript spread-syntax

TS引发奇怪的错误:

  

错误:(125,18)TS2569:类型'string'不是数组类型或字符串类型。使用编译器选项'--downlevelIteration'可以迭代迭代器。

为什么字符串不是字符串?

我想看看TS如何编译一个字符串的散布运算符。

我在浏览器控制台中的代码。字符串被分解为字符:

> s = 'abcdef';
> r = [...s];
< (6) ["a", "b", "c", "d", "e", "f"]

我在TS中的代码:

const s: string = 'abcdef';
const res = [...s]; // <= Error: Type 'string' is not an array type or a string type
console.log(res);

为什么?

TS版本:

  "dependencies": {
    "typescript": "^3.5.3"
  }

UPD:

@VtoCorleone 屏幕截图 enter image description here

UPD:

我的tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "downlevelIteration": false,
    "allowJs": true,
    "skipLibCheck": false,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": false,
    "noEmit": false,
    "sourceMap": true,
    "baseUrl": "./",
    "jsx": "preserve"
  },
  "compileOnSave": true,
  "files": [
    "sample.ts"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

2 个答案:

答案 0 :(得分:6)

展开对Heretic Monkey的评论:

将目标从#include <memory> #include <iostream> enum class Type : int { _Base = 0, _A = 1, _B = 2, _C = 3 }; class Base{ private: Type type = Type::_Base; public: virtual Type getType(){ return type; } }; class A : public Base{ private: Type type = Type::_A; public: virtual Type getType() override { return type; } }; class B : public Base{ private: Type type = Type::_B; public: virtual Type getType() override { return type; } }; class C : public Base{ private: Type type = Type::_C; public: virtual Type getType() override { return type; } }; std::shared_ptr<Base> letterFactory(Type which){ switch (which){ case Type::_A: return std::make_shared<A>(); case Type::_B: return std::make_shared<B>(); case Type::_C: return std::make_shared<C>(); default: return std::make_shared<Base>(Base()); } } template <typename Enum> constexpr typename std::enable_if<std::is_enum<Enum>::value, typename std::underlying_type<Enum>::type>::type to_integral(Enum const& value) { return static_cast<typename std::underlying_type<Enum>::type>(value); } int main(){ std::shared_ptr<Base> instanceOfA = letterFactory(Type::_A); std::cout << to_integral(instanceOfA->getType()) << std::endl; std::shared_ptr<Base> instanceOfB = letterFactory(Type::_B); std::cout << to_integral(instanceOfB->getType()) << std::endl; std::shared_ptr<Base> instanceOfC = letterFactory(Type::_C); std::cout << to_integral(instanceOfC->getType()) << std::endl; return 0; }; 更改为es5es2015可以解决此问题。为了清楚起见,这是我完整的es6

tsconfig.json

Working example

旁注:{ "compilerOptions": { "target": "es2015", "lib": [ "dom", "dom.iterable", "esnext" ], "allowJs": true, "skipLibCheck": true, "strict": true, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", }, "exclude": [ "node_modules" ], "include": [ "next-env.d.ts", "**/*.ts", "**/*.tsx" ] } 也对其进行了修复,但这对我来说似乎不是正确的解决方案。

答案 1 :(得分:0)

我有Angular-CLI(8)-在我的情况下,对键tsconfig.json(或es2018)的修改"target": "es2015"毫无帮助。仅添加"downlevelIteration": true会有所帮助。这是我的整个文件

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "esnext",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "downlevelIteration": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ]
  }
}