2

編集: これはまだサポートされておらず、Kotlin YouTrack で追跡されています


次の Typescript インターフェイスに一致する Kotlinexternal宣言を記述しようとしています (これは、 を介した JavaScript アクセスを表す有効な TS です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`

にコンパイルされた場合に有効になる可能性がありますconst length = headers["content-length"]

@JsName次の方法で回避するために使用しようとしました。

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

しかし、有効な JS 識別子である文字列のみを許可するため、これらはすべて失敗します。これを回避する方法はありますか?

4

3 に答える 3

2

この問題を回避するには、Kotlin でそのようなオブジェクトの代わりになる空のインターフェイスを定義し、さらに値を取得および設定するための拡張プロパティを定義することをお勧めします。

external interface KHeader // stands in for JavaScript objects with content-length property

var KHeader.contentLength: String
   get() = this.asDynamic()["content-length"]
   set(value) { this.asDynamic()["content-length"] = value }

このようにHeaderして、Kotlin で JavaScript オブジェクトをキャメル ケースで使用できます ( Playground を参照)

fun main() {
    val jsObject = js("{}")
    jsObject["content-length"] = "44"
    val randomHeader = jsObject as KHeader
    println(randomHeader.contentLength) // prints 44
    randomHeader.contentLength = "55"
    println(randomHeader.contentLength)  // prints 55
}
于 2021-01-31T11:50:52.417 に答える