Тип TypeScript для строки имени модуля - PullRequest
0 голосов
/ 20 ноября 2018

Справочная информация: TypeScript проверяет модули, которые вы пытаетесь и импортируете, и завершается неудачно во время компиляции, если используется строковый литерал, который не соответствует имени фактического модуля или пути к поддерживаемому типу файла.

Например, import {Component} from 'react' и import item from './item' компилируются нормально, но import {Component} from 'reactt' и import item from './otem' не могут быть скомпилированы при условии, что установлен модуль react и файл item.ts в проектено не установлен reactt модуль и нет ./otem файла с расширениями .ts, .js, .json и т. д. в проекте.

Проблема: Я не уверен, каксоздать функцию, в которой одним из аргументов является строковый литерал, который должен соответствовать фактическому модулю или поддерживаемому файлу.

function customImportEffect(moduleName: module_string_literal) {
    ...
}

Какой тип должен module_string_literal быть таким, чтобы компиляцияпроверка времени завершается неудачно, когда в качестве аргументов указываются неверные данные, такие как 'reactt' или './otem'?

Причина запроса: Я пытаюсь создать преобразователь файлов webpack (он же загрузчик)который добавляет код в начало TypeScrФайлы ipt перед их переносом, поэтому пользователи могут иметь безопасный код для перезагрузки горячего модуля.Например, представьте следующий код, вставляемый над каждым файлом машинописного текста перед его переносом в JS:

class HotModule {
    public static accept(moduleName: module_string_literal, onModuleReplace: Function(updatedModule: typeof import(moduleName)):void) {
        if(module.hot) {
            module.accept(moduleName.toString(), function() {
                onUpdate(require(moduleName.toString()))
            }
        }
    }
}

Тогда быстрая перезагрузка модуля могла бы быть безопасной для типов и выглядеть более чистой.Предполагая, что экспорт по умолчанию из файла ./item.ts - это объект с членом с именем message, можно написать

HotModule.accept("./item", ({message: newMessage}) => {
    const oldMessage = message;
    messages[messages.indexOf(oldMessage)] = message = newMessage;
}

, чтобы реализовать горячую перезагрузку сообщения вместо

* 1037.*

Я надеюсь, что это возможно, поскольку начиная с TypeScript v2.4 появилась возможность асинхронно динамически импортировать модули, и предоставленный строковый литерал проверяется на правильность, а неправильные строковые литералы вызывают сбой во время компиляции.

В настоящее время я просто включаю "types": ["webpack-env"] в объект compilerOptions в моем файле tsconfig.json, но я хотел бы использовать горячий модуль API, который лучше использует набор инструментов проверки TypeScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...