我在打字稿中定义了以下数组:let ids: string[] = [];
。然后,当我尝试推送一个id(可能是未定义的)时,出现编译错误:ids.push(id);
给了我以下编译错误:
TS2345:“字符串”类型的参数|未定义''不能分配给``字符串''类型的参数。类型'undefined'不能分配给类型'string'。
我可以创建未定义的字符串数组吗?
答案 0 :(得分:4)
是:
let ids: (string | undefined)[] = [];
答案 1 :(得分:0)
我怀疑您可能已在编译器配置中启用了strict
或strictNullChecks
标志(通过在调用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);
在这里,编译器无法确定x
是undefined
还是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!);