Неправильный выбор шрифта - PullRequest
0 голосов
/ 30 апреля 2020

Прошу прощения за, может быть, скучный вопрос, но я изучаю машинопись и столкнулся с ситуацией, которую не могу преодолеть.

Я использую Victory диаграммы, где компонент принимает данные типа DomainPropType. Поэтому я скачал и установил @ types / victory , чтобы использовать этот тип.

После этого можно передавать данные в компонент.

Но ...

// unimportant code was striped out

import { DomainPropType } from 'victory';

class Charts extends Component<Props, State> {
    private entireDomain: DomainPropType;

    public constructor(props: Props) {
        super(props);

        this.entireDomain = this.getEntireDomain();
        console.log(this.entireDomain);    // <= got {x:[82800000, 1206000000] ,y: [0, 1]}
        console.log(this.entireDomain.x);  // <= got 'Property 'x' does not exist on type 'DomainPropType'.
    }


    public getEntireDomain(): DomainPropType {
        const xValues = this.entireDataSet.map((item: DataSetItem) => item.x);
        const yValues = this.entireDataSet.map((item: DataSetItem) => item.y);

        return {
            x: [xValues[0].valueOf(), xValues[xValues.length - 1].valueOf()],
            y: [Math.min(...yValues), Math.max(...yValues)]
        };
    }
}


В первом файле console.log ясно видно, что entireDomain - это объект с ключом x. Так почему во втором console.log typeScript выбрасывает следующую ошибку?

Property 'x' does not exist on type 'DomainPropType'.
Property 'x' does not exist on type '[number, number]'.

Хорошо, это также говорит [number, number]. Однако вот как выглядит тип:

enter image description here

Если я правильно понимаю ... DomainPropType также может иметь тип { x?: DomainTuple; y: DomainTuple; }. Тогда почему typeScript выбрал неправильный для проверки? Пожалуйста, кто-нибудь объяснит мне.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Когда вы добавляете тип к аргументу / конструктору функции, машинописный текст предполагает, что где-то еще в вашем коде кто-то может вызвать эту функцию / конструктор с этими аргументами.

Так что даже если вы используете свой класс только один раз и в этом конкретном c случае, когда вы передаете объект со свойствами x и y, все еще возможно, что позже вы также будете использовать класс и использовать форматы [number, number] или [Date, Date].

Чтобы избежать этого, у вас есть 2 варианта:

  1. Не используйте DomainPropType в качестве типа аргумента, а вместо этого используйте только тот тип c, который вы действительно хотите использовать.
  2. В вашем конструкторе правильно обрабатывайте случаи [number, number] и [Date, Date].

Если вы никогда не намереваетесь вызывать этот объект с помощью [Date, Date] или [number, number], переход к варианту 1: вероятно, самый простой.

Пример более специфического c типа, который, я думаю, будет работать для вашего случая:

type MyDomainPropType = {
   x: DomainTuple,
   y?: DomainTuple
}
0 голосов
/ 30 апреля 2020

Вы можете привести ваш массив следующим образом:

return {
            x: [xValues[0].valueOf(), xValues[xValues.length - 1].valueOf()],
            y: [Math.min(...yValues), Math.max(...yValues)]
        } as DomainPropType;

Возможно, ваша ошибка связана с обнуляемым x или y, который вы видите на скриншоте.

...