Внешнее объявление Kotlin / JS - «Имя содержит недопустимые символы, которые не могут отображаться в идентификаторе JavaScript» - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь написать внешнюю декларацию, соответствующую следующему интерфейсу машинописного текста (это допустимый TS для представления доступа к JavaScript через headers['content-length']):

export interface Headers {
  'content-length'?: string;
}

Dukat генерирует следующее, что следует учитыватьдопустимый:

external interface Headers {
    var `content-length`: String? get() = definedExternally; set(value) = definedExternally
}

Но теперь компилятор жалуется:

Name contains illegal chars that can't appear in JavaScript identifier

Это правда, что он не может появиться в идентификаторе JS,но это не обязательно. Все обращения Kotlin к этому свойству, такие как:

val length = headers.`content-length`

могут быть действительными, если скомпилированы в let length = headers["content-length"].

Я пытался использовать @JsName Обойти это можно следующими способами:

  • @JsName("content-length")
  • @JsName("'content-length'")
  • @JsName("\"content-length\"")

Но всеиз них не удается, потому что они ограничивают строку действительными идентификаторами.Есть ли способ обойти это?

РЕДАКТИРОВАТЬ: я открыл вопрос на Kotlin YouTrack

1 Ответ

1 голос
/ 04 июня 2019

Проблема в том, что дефисы - не являются допустимыми идентификаторами в Javascript . Это означает, что вы не можете объявить переменную следующим образом:

var content-length = 4

Вы можете сделать только это: var contentLength = 4

Kotlin Kultiplatform не позволит вам написать общий код, который не может быть скомпилирован с целевой платформой, поэтому даже если это правильный код Kotlin:

var `content-length`: String? // ...

вы все еще не можете использовать его в многоплатформенной среде из-за ограничений Javascript .

Обратите также внимание, что, хотя это может быть действительным кодом Typescript , у Kotlin нет цели Typescript, только цель Javascript, поэтому имейте это в виду.

...