我可以定义字符串数组并且在打字稿中未定义吗?

时间:2019-02-21 16:44:34

标签: typescript

我在打字稿中定义了以下数组:let ids: string[] = [];。然后,当我尝试推送一个id(可能是未定义的)时,出现编译错误:ids.push(id);给了我以下编译错误:

  

TS2345:“字符串”类型的参数|未定义''不能分配给``字符串''类型的参数。类型'undefined'不能分配给类型'string'。

我可以创建未定义的字符串数组吗?

2 个答案:

答案 0 :(得分:4)

是:

let ids: (string | undefined)[] = [];

答案 1 :(得分:0)

我怀疑您可能已在编译器配置中启用了strictstrictNullChecks标志(通过在调用tsc时通过命令行或在tsconfig.json文件中)

  

在严格的null检查模式下,null和undefined值不在每种类型的域中,并且只能分配给它们自己和任何值(一个例外是undefined也可以分配给void)。   [1]

作为示例,我们可以使用以下示例代码来重现此内容,

let ids: string[] = [];
let x: string | undefined;
x = Math.random() > 0.5 ? undefined : 'hello';
ids.push(x);

在这里,编译器无法确定xundefined还是string。 (请注意,如果您执行x = 'hello',则编译器可以在运行时静态检查x不是undefined

我们将在启用strict标志的情况下进行编译(这也会启用strictNullChecks标志)

我们收到以下编译器错误

src/main.ts:4:10 - error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

4 ids.push(x);
           ~

因此,您可能希望将ids变量定义为(string | undefined)[]作为另一个答案,或者考虑禁用严格标志。

另一种可能的解决方案是使用!Non-null assertion operator)运算符绕过编译器(但是在很多情况下,由于编译器不再对您有帮助,因此您有意忽略这种情况下的潜在错误)

ids.push(x!);