Порт Java-модуль для JS с JSweet
Я хотел бы преобразовать эти функции Java в JavaScript: CircleFitter.java. Мне не нужны части для чтения файлов.
JSweet кажется хорошим вариантом. Итак, я попытался вставить содержимое файла Java в онлайн-песочницу JSweet, но получаю следующие ошибки:
Line 58: module 'java.io' has no exported member 'FileReader'
Line 58: property 'FileReader' does not exist on type 'typeof io'
Line 58: module 'java.text' has no exported member 'DecimalFormat'
Line 58: property 'DecimalFormat' does not exist on type 'typeof text'
Line 58: module 'java.text' has no exported member 'DecimalFormatSymbols'
Line 58: property 'DecimalFormatSymbols' does not exist on type 'typeof text'
Line 58: module 'java' has no exported member 'awt'
Line 58: property 'awt' does not exist on type 'typeof java'
Line 69: property 'in' does not exist on type 'typeof System'
Line 76: property 'exit' does not exist on type 'typeof System'
Line 125: property 'exit' does not exist on type 'typeof System'
Line 128: property 'exit' does not exist on type 'typeof System'
Эти ошибки, кажется, делятся на 2 категории:
- модуль __ не имеет экспортированного члена __
- свойство __ не существует для типа __
Я не использую Java, поэтому понятия не имею, как их обойти. Я ценю помощь.
1 ответ
JSweet имеет ограниченную поддержку API Java. В "песочнице" используется библиотека эмуляции j4ts, которая не обеспечивает реализацию ни пакета java.text, ни java.io. Он также не поддерживает System.exit (потому что большую часть времени он не имеет смысла в браузере). Наконец, любая поддержка java.awt чрезвычайно сложна и может быть только очень частичной. Поэтому лучше всего избегать использования неподдерживаемых API-интерфейсов Java и заменять их API-интерфейсами JavaScript (JSweet предоставляет к ним доступ).
Однако с помощью JSweet можно скомпилировать некоторые библиотеки Java в TypeScript/JavaScript. Организация J4TS предоставляет несколько примеров того, как компилировать и поддерживать некоторые библиотеки Java. Если ваша программа использует неподдерживаемые библиотеки, у вас есть несколько вариантов решения проблем:
- переписать / перепроектировать вашу программу, чтобы удалить зависимости, которые не поддерживаются
- при этом вы можете использовать аннотацию @jsweet.lang.Erased для методов и полей, чтобы исключить некоторый код из перевода (если вы вообще не хотите изменять свой код, вы можете определить эти аннотации в файле jsweetconfig.json)
- внести свой вклад в J4TS, чтобы добавить поддержку API, которые вы хотите использовать
- в JSweet v2 напишите расширение JSweet для собственной поддержки новых API.
JSweet v2 еще не выпущен, но он предоставляет API для расширения транспилятора и собственной поддержки большего количества API. Я советую использовать его при наличии.