@MishaXXL

По какой логике работает типизация ListNode во вложенном массиве?

https://leetcode.com/problems/merge-k-sorted-lists/
Решил решить задачу на литкоде, но почему-то ТС ругается
Line 14: Char 22: error TS2739: Type 'ListNode[]' is missing the following properties from type 'ListNode': val, next

Как вообще тип ListNode связан с такими значениями [[1,4,5],[1,3,4],[2,6]]?
И почему он ругается на ошибку?

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
    if(lists.length) return lists.flat(Infinity)
    return null
}


Хотя запуская этот код в песочнице, работает без ошибок
https://jsfiddle.net/boilerplate/typescript

class ListNode {
     val: number
     next: ListNode | null
     constructor(val?: number, next?: ListNode | null) {
         this.val = (val===undefined ? 0 : val)
        this.next = (next===undefined ? null : next)
    }
}


const lists = [[1,4,5],[1,3,4],[2,6]]

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
    if(lists.length) return lists.flat(Infinity)
    return null
};

console.log(mergeKLists(lists))
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
в песочнице работает без ошибок
А чего бы ему ошибаться? Песочница типы не проверяет, только компилирует TS в JS, чтобы его можно было исполнить.
В итоге остаётся только это*:
const lists = [[1,4,5],[1,3,4],[2,6]]

function mergeKLists(lists) {
    if(lists.length) return lists.flat(Infinity)
    return null
};

console.log(mergeKLists(lists))

А если уж совсем упростить, то вот это:
[[1,4,5],[1,3,4],[2,6]].flat(Infinity)
Тут падать нечему.

А вот если в нормальной IDE такое написать, сразу видно, что у вас в lists ерунда содержится:
662cd790d4dd1476028947.png
Функция на вход ожидает массив, внутри которого содержится объект класса ListNode (или null), а вы передаёте массив массивов number, на что вам TS и указывает (но окольными путями).
Ну и вернуть вы должны ListNode, а ваша реализация возвращает всё тот же массив из number.

Задача, на самом деле, какая-то странная - непонятно откуда вообще вылез этот ListNode и зачем он. За скобками осталась важная часть про то, что вам нужно вдобавок реализовать сериализацию ListNode <-> массив. Хотя, по сгенерированной заготовке решения предполагается, что вам уже на вход придут данные в нужном виде и вернуть вам нужно объект ListNode - может, leetcode сам этот класс и его сериализацию-десериализацию реализует?

* Класс тоже остаётся, но он никак в коде не используется, поэтому я его опустил.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
09 мая 2024, в 18:17
5000 руб./за проект
09 мая 2024, в 18:02
13000 руб./за проект
09 мая 2024, в 17:55
500 руб./за проект