/** * Εργασία 1: Γενικά και Ασφάλεια Τύπου Κλειδιού * Δημιουργήστε μια συνάρτηση `getProperty` που παίρνει ένα αντικείμενο και ένα κλειδί. * Χρησιμοποιήστε γενικούς τύπους για να διασφαλίσετε ότι η συνάρτηση είναι ασφαλής τύπου και ότι το κλειδί υπάρχει στο αντικείμενο. */ function getProperty<T extends Record<string, unknown>, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } getProperty('str', 'toString') /** * Εργασία 2: Δεδομένων πολλαπλών δηλώσεων διεπαφής Todo παρακάτω, εξηγήστε τι συμβαίνει όταν αυτές υπάρχουν στον ίδιο χώρο. * Συζητήστε πώς τις αντιμετωπίζει η TypeScript και συμπληρώστε το αντικείμενο `myTodo` για να ικανοποιεί τις απαιτήσεις της συγχωνευμένης διεπαφής Todo. */ interface Todo { title: string; dueDate: Date; } interface Todo { description: string; completed: boolean; }
sobes.tech AI
Απάντηση από AI
Задача 1: Функция getProperty использует дженерики и ограничение K extends keyof T, чтобы гарантировать, что ключ key существует в объекте obj типа T. Это обеспечивает типобезопасный доступ к свойствам объекта.
Пример функции:
function getProperty<T extends Record<string, unknown>, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const result = getProperty({name: 'Alice', age: 30}, 'name'); // тип string
Вызов getProperty('str', 'toString') корректен, так как у строки есть метод toString.
Задача 2: В TypeScript несколько деклараций интерфейса с одинаковым именем в одной области видимости объединяются (merged). Это значит, что итоговый интерфейс Todo будет содержать все свойства из обеих деклараций:
interface Todo {
title: string;
dueDate: Date;
description: string;
completed: boolean;
}
Чтобы объект myTodo соответствовал объединённому интерфейсу, нужно определить все эти свойства:
const myTodo: Todo = {
title: 'Learn TypeScript',
dueDate: new Date('2024-12-31'),
description: 'Study advanced TypeScript features',
completed: false
};
Таким образом, декларации интерфейсов в TypeScript можно расширять путём повторного объявления, что удобно для постепенного добавления свойств.