Проблема с типом кортежа

#javascript #arrays #typescript #tuples

#javascript #массивы #typescript #кортежи

Вопрос:

недавно я попытался следовать ProAngular Адама Фримена, и я столкнулся с проблемой, которую я не могу найти в другом месте. У меня есть код:

 canActivate(route:ActivatedRouteSnapshot,state:RouterStateSnapshot)
:Promise<boolean>|boolean{
    if (route.params['mode']=='create') {
        return new Promise<boolean>((resolve, reject) =>  {
            let responses:[[string, (string) => void]] = [
            ['Tak', () => {resolve(true)}],
            ['Nie', () => {
                this.router.navigateByUrl(this.router.url);
                resolve(false);
                }]
            ];
            this.messages.reportMessage(new Message('Akceptujesz warunki?', false, responses));

        });
    }
    else{
        return true;
    }
  

Вот конструктор класса, ответственного за сообщение.

 export class Message{
constructor(private text:string, private error:boolean = false,
                private responses?:[[string, (string) => void]]){

}
  

}

Кажется, все в порядке, но я получаю сообщение об ошибке:

 error TS2322: Type '[[string, () => void], [string, () => void]]' is not assignable to type '[[string, (string: any) => void]]'.
Types of property 'length' are incompatible.
Type '2' is not assignable to type '1'.
  

Это странно, поскольку мой код такой же, как и в книге. Я знаю, что это что-то маленькое, но я действительно не знаю, как это выяснить. Кто-нибудь может помочь?

Ответ №1:

Типы свойства ‘length’ несовместимы.
Тип ‘2’ нельзя присвоить типу ‘1’.

 let responses:[[string, (string) => void]]
  

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

Вам нужно изменить ваше responses объявление на:

 let responses: [string, (string) => void][]
  

или

 let responses: Array<[string, (string) => void]>
  

Комментарии:

1. Я пробовал это решение, проблема все еще существует даже с этим разъяснением. Это связано с размером «массива», поскольку в ответах присутствуют 2 элемента.

2. Попробуйте добавить let responses: Array<[string, () => void]> or [string, () => void][] в качестве вашего типа массива. Ваше текущее объявление типа означает массив с одним-единственным tuple

3. Проблема не в функции ReportMessage, а в объявлении переменной.

4. Мой комментарий выше касается только вашего responses объявления, а не вашей ReportMessage функции.

5. ответ @ethane правильный, если изменить тип на «[string, (строка) => void][]», код будет скомпилирован правильно