为什么方法push()带下划线?

时间:2020-03-13 15:32:34

标签: javascript arrays string typescript

首先,您好,我试图用TypeScript制作一个虚构的购物车进行练习。所以我做了,现在我有一个问题在这里,代码。

class Warenkorb {
    liste:string[];

    add(produkt):void{
        this.liste.push(produkt);
    }
}

这是第一个没有底线的作品。

class Warenkorb {
    liste:string|number[];

    add(produkt):void{
        this.liste.push(produkt);
    }
}

所以这是问题所在。当我想要数字或字符串时,push方法用红色强调,这对练习来说不是问题,因为产品只应该是字符串,但我也想知道为什么会这样。

对不起,我/我是德国/奥地利人:D

3 个答案:

答案 0 :(得分:4)

这两个都应该向您显示错误,因为produkt隐式具有类型any

list的问题在于它是stringnumber[]。如果要允许它同时包含字符串和数字,则需要(string | number)[]

您还需要使用空数组初始化liste

所以:

class Warenkorb {
    liste: (string|number)[] = [];
// −−−−−−−−^−−−−−−−−−−−−−^   ^^^^−−−−−−−−−−−−
    add(produkt: string|number):void{
// −−−−−−−−−−−−^^^^^^^^^^^^^^^
        this.liste.push(produkt);
    }
}

答案 1 :(得分:2)

在第二个示例中语法不正确,您需要为两个数据类型添加数组,如下所示:

class Warenkorb {
liste:string[]|number[] = [];

add(produkt):void{
    this.liste.push(produkt);
}

现在,您要定义它是字符串数组还是数字数组,并用一个空数组初始化,否则它将具有默认值undefined并发生错误。

在您的情况下,您可以将其定义为字符串或数字数组。因此push方法在字符串上不存在。

string|number[]

答案 2 :(得分:2)

您写的符号说:liste的类型为stringnumber[]

这就是你想说的

class Warenkorb {
  liste: (string|number)[];

  add(produkt: string|number):void {
    this.liste.push(produkt);
  }
}

请注意,如果要启用严格模式。您将收到另一个错误。可能会说构造函数中未定义“ liste”的代码。您要么使用liste: (string|number)[] = [],要么创建构造函数并在其中进行分配。