Справочная информация: 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.