TypeScript: аргумент типа 'Card | undefined 'не может быть назначен параметру типа' Card ' - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь сделать Блэкджек в качестве упражнения для изучения TypeScript. Когда я запускаю программу, игрок успешно получает две карты из обуви, но я получаю предупреждение Argument of type 'Card | undefined' is not assignable to parameter of type 'Card'.

Вот мой код:

class Card {
    suit: string;
    value: number;
    name: string;
    constructor(suit: string, value: number, name: string) {
        this.suit = suit;
        this.value = value;
        this.name = name;
    }
    greet() {
        console.log(`This card is a ${this.value} of ${this.suit}`)
    }
}

class Deck {
    static suits = ["Diamonds", "Clubs", "Hearts", "Spades"]
    static cardTypes = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
    cards: Card[] = [];
    makeDeck() {
        let cards: Card[] = [];
        for (let i = 0; i < Deck.suits.length; i++) {
            for (let j = 0; j < Deck.cardTypes.length; j++) {
                let value = Deck.cardTypes[j];
                let numValue: number;
                let name: string;
                if (
                    value === "Jack" ||
                    value === "Queen" ||
                    value === "King"
                ) {
                    numValue = 10
                } else if (value === "Ace") {
                    numValue = 11
                }
                else {
                    numValue = parseInt(Deck.cardTypes[j]);
                }

                name = `${value} of ${Deck.suits[i]}`

                cards.push(new Card(Deck.suits[i], numValue, name))
            }
        }
        return cards;
    }
    constructor() {
        this.cards = this.makeDeck()
    }
    presentDeck() {
        console.log(this.cards)
    }
}

class Shoe {
    numberOfDecks: number;
    cards: Card[] = [];
    constructor(numberOfDecks: number) {
        this.numberOfDecks = numberOfDecks
        this.cards = this.makeShoe()
    }
    makeShoe() {
        let cards: Card[] = [];
        for (let i = 0; i < this.numberOfDecks; i++) {
            let deck = new Deck();
            for (let j = 0; j < deck.cards.length; j++) {
                cards.push(deck.cards[j])
            }
        }
        return cards;
    }
    shuffleCards(cards: Card[] = this.cards) {
        var j, x, i;
        for (i = cards.length - 1; i > 0; i--) {
            j = Math.floor(Math.random() * (i + 1));
            x = cards[i];
            cards[i] = cards[j];
            cards[j] = x;
        }
        return cards;
    }
    presentShoe() {
        console.log(this.cards)
    }
    dealCard() {
        return this.cards.pop();
    }
}

class Hand {
    private _cards: Card[] = [];
    receiveCard(card: Card) {
        this.cards.push(card);
    }
    get cards(): Card[] {
        return this._cards
    }
}

let deck = new Deck();
let shoe = new Shoe(2);
let player = new Hand();

shoe.shuffleCards();
player.receiveCard(shoe.dealCard());
player.receiveCard(shoe.dealCard());
console.log(player.cards)

Ошибка на shoe.dealCard() части в конце. Я не уверен, почему тип состоит из двух частей: Card и undefined. И я не уверен, что не определено.

1 Ответ

0 голосов
/ 17 марта 2020

Ошибка возникает из-за того, что this.cards.pop() может вернуть undefined, когда this.cards не имеет элементов (this.cards === []). Один из способов устранить ошибку - использовать оператор ненулевого подтверждения !. Этот оператор принимает, что это выражение никогда не будет нулевым и больше не отображает ошибку.

dealCard() {
    return this.cards.pop()!;
}
...