TS TypeScript  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Миграция большого проекта с JavaScript

Профессиональный тест по теме «Миграция большого проекта с JavaScript»: сложные фрагменты кода, архитектурные компромиссы, диагностика и надёжность. Вопросы требуют читать код, сопоставлять статические гарантии с поведением JavaScript и выбирать решение, которое не рассыплется при развитии проекта.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет не результат JavaScript, а то, что TypeScript способен доказать до запуска.
Вопрос 1 из 30
Что даёт allowJs без checkJs?
TypeScript
{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": false
  }
}
Вопрос 2 из 30
Что делает // @ts-check в JavaScript-файле?
TypeScript
// @ts-check
function add(a, b) { return a + b; }
Вопрос 3 из 30
Как отключить проверку одного проблемного JS-файла, не отменяя миграцию проекта?
TypeScript
// Фрагмент для анализа
// @ts-nocheck
Вопрос 4 из 30
С какого набора JS-файлов разумно начать checkJs?
Вопрос 5 из 30
Почему число диагностик после включения checkJs не равно числу дефектов?
Вопрос 6 из 30
Что даёт аннотация JSDoc @param {string} id в этом JavaScript-файле?
TypeScript
/** @param {string} id */
function loadUser(id) {}
Вопрос 7 из 30
Как импортировать тип в JSDoc?
TypeScript
/** @param {import("./types").UserId} id */
function load(id) {}
Вопрос 8 из 30
Что даёт declaration при allowJs?
TypeScript
{
  "allowJs": true,
  "declaration": true,
  "emitDeclarationOnly": true
}
Вопрос 9 из 30
Когда переименовывать .js в .ts?
Вопрос 10 из 30
Почему миграция по вертикальному сценарию иногда лучше по слоям?
Вопрос 11 из 30
Почему any распространяется дальше места появления?
TypeScript
declare const legacy: any;
const user = legacy.load();
const name = user.profile.name;
Вопрос 12 из 30
Как локализовать нетипизированную библиотеку?
TypeScript
function parseLegacy(input: string): DomainResult {
  const raw: unknown = legacy.parse(input);
  return decodeDomainResult(raw);
}
Вопрос 13 из 30
Чем @ts-expect-error лучше @ts-ignore в миграции?
TypeScript
// @ts-expect-error — legacy callback has wrong declaration, issue #418
legacy.on("data", handler);
Вопрос 14 из 30
Какой показатель лучше простого числа any?
Вопрос 15 из 30
Когда утверждение типа допустимо при миграции?
Вопрос 16 из 30
Как сделать базовую линию ошибок измеримой?
TypeScript
tsc --noEmit --pretty false
Вопрос 17 из 30
Как @ts-expect-error защищает от регрессии подавления?
TypeScript
// @ts-expect-error — временно до обновления types
legacyCall(1);
Вопрос 18 из 30
Зачем типовые consumer-тесты при переименовании JS-модуля?
TypeScript
import { createClient } from "../src/client";
const client = createClient({ timeoutMs: 100 });
Вопрос 19 из 30
Как строить CI на долгой миграции?
Вопрос 20 из 30
Как понять, что этап миграции завершён качественно?
Вопрос 21 из 30
Что должен подтвердить типовой тест JS-функции с JSDoc во время поэтапной миграции?
TypeScript
// @ts-check
/**
 * @param {string} id
 * @param {(user: {id: string, name: string}) => void} done
 */
export function loadUser(id, done) { /* legacy body */ }
Вопрос 22 из 30
Какой отрицательный пример полезен для функции, уже описанной JSDoc?
TypeScript
// @ts-check
/** @param {string} id */
function loadUser(id) {}
Вопрос 23 из 30
Почему замена any на интерфейс в месте JSON.parse всё ещё недостаточна?
TypeScript
const raw = JSON.parse(source);
// Небезопасно: const user = raw as User;
Вопрос 24 из 30
После переименования helper.js в helper.ts часть потребителей стала получать более широкий тип. Что проверять?
Вопрос 25 из 30
Какой набор критериев честнее показывает прогресс миграции?
Вопрос 26 из 30
Какой публичный контракт помогает мигрировать реализацию частями?
TypeScript
export interface UserGateway {
  load(id: UserId): Promise<UserSummary | undefined>;
}
Вопрос 27 из 30
Что здесь сильнее всего закрепляет случайную форму legacy-объекта?
TypeScript
const legacyUser = { id: "", name: "", cacheState: {} };
export type PublicUser = typeof legacyUser;
Вопрос 28 из 30
У мигрируемой функции появляются locale и signal. Как лучше развить вызов?
TypeScript
interface LoadOptions { locale?: string; signal?: AbortSignal; }
declare function loadUser(id: string, options?: LoadOptions): Promise<UserSummary>;
Вопрос 29 из 30
Как проверить совместимость JS- и TS-потребителей во время перехода?
Вопрос 30 из 30
Какой симптом показывает, что миграция создала слишком сложную типовую оболочку?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу