#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][]», код будет скомпилирован правильно