Как использовать анонимные классы Kotlin в качестве аргументов для нативных функций JavaScript?

Я устанавливаю уровень взаимодействия для этого класса ThreeJS, и конструктор класса принимает объект, который используется для установки свойств.

//PointCloudMaterial.js    
THREE.PointCloudMaterial = function ( parameters ) {
    THREE.Material.call( this );
    this.color = new THREE.Color( 0xffffff );
    this.map = null;
    this.size = 1;
    this.sizeAttenuation = true;
    this.vertexColors = THREE.NoColors;
    this.fog = true;
    this.setValues( parameters );
};

Вот что я хотел бы сделать в Котлине: возможно ли использовать аномальные объекты в моде? Первоначально я думал о создании объекта, эквивалентного возможным периметрам для передачи, проблема в том, что он переопределит текущие значения, а это не то, чего я хочу.

//Interop Layer
native("THREE.PointCloudMaterial")
public class PointCloudMaterial(parameters: object) { } //This doesn't compile "Type Expected"

//Example usage
var sizeObject = object {
     var size: Double = size
}
PointCloudMaterial(sizeObject);

1 ответ

Решение

Тип безопасного решения может выглядеть так:

native 
val <T> undefined: T = noImpl

class PointCloudMaterialParameters (
   val color: Int = undefined,
   val opacity: Double = undefined,
   //val map: THREE.Texture = undefined,
   val size: Double = undefined,
   //val blending: THREE.NormalBlending = undefined,
   val depthTest: Boolean = undefined,
   val depthWrite: Boolean = undefined,
   val vertexColors: Boolean = undefined,
   val fog: Boolean = undefined
)

fun main(args : Array<String>) {
  println(PointCloudMaterialParameters(size = 2.0))
}

native("THREE.PointCloudMaterial")
public class PointCloudMaterial(parameters: PointCloudMaterialParameters)

//Example usage
PointCloudMaterial(PointCloudMaterialParameters(size = 2.0))

Другое решение, которое короче, но не является безопасным типом:

native("THREE.PointCloudMaterial")
public class PointCloudMaterial(parameters: Any)

//Example usage
PointCloudMaterial(object { val size = 2.0 })

PS Мы постараемся упростить этот случай в будущем.

Другие вопросы по тегам