TypeScript 联合类型不能用作数组

TypeScript union type cannot be used as an array

这是我能够将问题减少到:

interface Word {
    value: string | string[];
}

const w: Word = {
    value: [] as string[] 
    // also tried: 
    // value: []
    // value: ['test']
}

w.value.push('')

我的 IDE 中的最后一行错误,因为 “push”对于类型“string | string[]”不存在 (ts2339)。它也不会编译!

这是一个错误吗?是特色吗?如何帮助这个?

[] as string[] 在您的代码中并没有真正做太多事情,因为从用法中已经很清楚这个数组将是一个字符串数组,然后您将对象分配给 Word。您定义了 Word 以便值可以是字符串或字符串数​​组,虽然您可能从数组开始,但您定义的类型表示您可以将其更改为不同行上的字符串代码。由于该值可能不是数组,除非您首先验证它是一个数组,否则打字稿不会让您推送它。

例如:

if (Array.isArray(w.value)) {
  w.value.push('');
} else {
  w.value = [w.value, ''];
}

如果您希望 w 成为更窄的类型,类似于 Word 但保证值始终为数组,则执行此操作:

const w: Word & { value: string[] } = {
 value: []
}