NativeScript Core

Kotlin to JavaScript Conversion

The article lists the available types in Kotlin and how they are projected to JavaScript.

Keep in mind that some of Kotlin's fundamental types are translated to a Java type by the Kotlin compiler when targeting Android or the JVM. Those types are the following:

Kotlin non-nullable type Java type Kotlin nullable type Java type
kotlin.Any java.lang.Object kotlin.Any? java.lang.Object
kotlin.String java.lang.String kotlin.String? java.lang.String
kotlin.Char char kotlin.Char? java.lang.Character
kotlin.Boolean boolean kotlin.Boolean? java.lang.Boolean
kotlin.Byte byte kotlin.Byte? java.lang.Byte
kotlin.Short short kotlin.Short? java.lang.Short
kotlin.Int int kotlin.Int? java.lang.Integer
kotlin.Long long kotlin.Long? java.lang.Long
kotlin.Float float kotlin.Float? java.lang.Float

Although the conversion of Kotlin types in NativeScript is quite the same as the Java conversion, let's take a look at some examples.

String & Character

Both kotlin.String and kotlin.Char types are projected as JavaScript String:

var kotlinClass = new com.example.KotlinClassWithStringAndCharProperty();
var str1 = kotlinClass.getStringProperty(); // returns kotlin.String, converted to JS String
var str2 = kotlinClass.getCharProperty(); // returns kotlin.Char, converted to JS String

Boolean

Kotlin's boolean type kotlin.Boolean is projected as JavaScript Boolean:

var kotlinClass = new com.example.KotlinClassWithBooleanProperty();
var enabled = kotlinClass.getBooleanProperty(); // returns Kotlin Boolean, converted to JS Boolean

Byte

Kotlin's byte type kotlin.Byte is projected as JavaScript Number:

var kotlinClass = new com.example.KotlinClassWithByteProperty();
var jsByteValue = kotlinClass.getByteProperty(); // returns Kotlin Byte, converted to Number

Short

Kotlin's short type kotlin.Short is projected as JavaScript Number:

var kotlinClass = new com.example.KotlinClassWithShortProperty();
var jsShortValue = kotlinClass.getShortProperty(); // returns Kotlin Short, converted to Number

Integer

Kotlin's integer type kotlin.Int is projected as JavaScript Number:

var kotlinClass = new com.example.KotlinClassWithIntProperty();
var jsIntValue = kotlinClass.getIntProperty(); // returns Kotlin Int, converted to Number

Float

Kotlin's float type kotlin.Float is projected as JavaScript Number:

var kotlinClass = new com.example.KotlinClassWithFloatProperty();
var jsFloatValue = kotlinClass.getFloatProperty(); // returns Kotlin Float, converted to Number

Double

Kotlin's double type kotlin.Double is projected as JavaScript Number:

var kotlinClass = new com.example.KotlinClassWithDoubleProperty();
var jsDoubleValue = kotlinClass.getDoubleProperty(); // returns Kotlin double, converted to Number

Long

Kotlin's long type kotlin.Long is a special type which is projected to JavaScript by applying the following rules:

  • If the value is in the interval (-2^53, 2^53) then it is converted to Number
  • Else a special object with the following characteristics is created:
    • Has Number.NaN set as a prototype
    • Has value property set to the string representation of the Kotlin long value
    • Its valueOf() method returns NaN
    • Its toString() method returns the string representation of the Kotlin long value
package com.example

class KotlinClassWithLongProperties {
    val longNumber54Bits: Long
        get() = (1 shl 54).toLong()
    val longNumber53Bits: Long
        get() = (1 shl 53).toLong()
}

Array

Array in Kotlin is a special object that has an implicit Class associated. A Kotlin Array is projected to JavaScript as a special JavaScript proxy object with the following characteristics:

  • Has length property
  • Has registered indexed getter and setter callbacks, which:
    • If the array contains elements of type convertible to a JavaScript type, then accessing the n-th element will return a converted type
    • If the array contains elements of type non-convertible to JavaScript, then accessing the n-th element will return a proxy object over the Kotlin type (see Accessing APIs)
var kotlinClass = new com.example.KotlinClassWithStringArrayProperty();
var kotlinArray = kotlinClass.getStringArrayProperty(); // kotlinArray is a special object as described above
var firstStringElement = kotlinArray[0]; // the indexed getter callback is triggered and the kotlin.String is returned as a JS string

Note: A Kotlin Array is intentionally not converted to a JavaScript Array for the sake of performance, especially when it comes to large arrays.

Creating arrays

Occasionally you have to create Kotlin arrays from JavaScript. Because of the translation of the fundamental Kotlin types to Java types in Android, creating Kotlin array could be done the same way Java arrays are created. This is described in Java to JavaScript

Null

The Kotlin null literal (or null pointer) is projected to JavaScript Null:

var kotlinClass = new com.example.KotlinClassWithNullableProperty();
var nullableValue = kotlinClass.getNullableProperty(); // if there is no value, the method will return JS null

Kotlin Types

All Kotlin types are projected to JavaScript using the Package and Class proxies as described in Accessing APIs

Kotlin Companion objects

Kotlin's companion objects could be accessed in JavaScript the same way they can be accessed in Java - by accessing the Companion field:

var companion = com.example.KotlinClassWithCompanion.Companion;
var data = companion.getDataFromCompanion();

Kotlin Object

Kotlin's objects could be accessed in JavaScript the same way they can be accessed in Java - by accessing the INSTANCE field:

var objectInstance = com.example.KotlinObject.INSTANCE;
var data = objectInstance.getDataFromObject();

Accessing Kotlin properties

Kotlin's properties could be accessed in JavaScript the same way they can be accessed in Java - by using their compiler-generated get/set methods. Non-boolean Kotlin properties could be used in NativeScript applications as JS fields as well.

var kotlinClass = new com.example.KotlinClassWithStringProperty();

var propertyValue = kotlinClass.getStringPropert();
kotlinClass.setStringProperty("example");

propertyValue = kotlinClass.stringProperty;
kotlinClass.stringProperty = "second example";

Accessing Kotlin package-level functions

Currently using Kotlin package-level functions could not be achieved easily. In order to use a package-level function, the class where it's defined should be known. Let's take a look at an example:

var randomNumber = com.example.FunctionsKt.getRandomNumber();

In the example above, the class FunctionsKt is autogenerated by the Kotlin compiler and its name is based on the name of the file where the functions are defined. Kotlin supports annotating a file to have a user provided name and this simplifies using package-level functions:

var randomNumber = com.example.UtilityFunctions.getRandomNumber();

Accessing Kotlin extension functions

Currently using Kotlin extension functions could not be achieved easily. In order to use an extension function, the class where it's defined should be known. Also, when invoking it, the first parameter should be an instance of the type for which the function is defined. Let's take a look at an example:

var arrayList = new java.util.ArrayList();
arrayList.add("firstElement");
arrayList.add("secondElement");
com.example.Extensions.switchPlaces(arrayList, 0, 1);

In the example above, the class ExtensionsKt is autogenerated by the Kotlin compiler and its name is based on the name of the file where the functions are defined. Kotlin supports annotating a file to have a user provided name and this simplifies using package-level functions:

var arrayList = new java.util.ArrayList();
arrayList.add("firstElement");
arrayList.add("secondElement");
com.example.ExtensionFunctions.switchPlaces(arrayList, 0, 1);