feat(Inner Classes): generate typescript type definitions and JS for Inner Classes.
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
declare namespace JS_TESTS {
|
||||
type Nullable<T> = T | null | undefined
|
||||
namespace foo {
|
||||
class TestInner {
|
||||
constructor(a: string);
|
||||
readonly a: string;
|
||||
readonly Inner: {
|
||||
new(a: string): TestInner.Inner;
|
||||
} & typeof TestInner.Inner;
|
||||
}
|
||||
namespace TestInner {
|
||||
class Inner {
|
||||
protected constructor($outer: foo.TestInner, a: string);
|
||||
readonly a: string;
|
||||
readonly concat: string;
|
||||
static fromNumber(a: number): foo.TestInner.Inner;
|
||||
readonly SecondLayerInner: {
|
||||
new(a: string): TestInner.Inner.SecondLayerInner;
|
||||
} & typeof TestInner.Inner.SecondLayerInner;
|
||||
}
|
||||
namespace Inner {
|
||||
class SecondLayerInner {
|
||||
protected constructor($outer: foo.TestInner.Inner, a: string);
|
||||
readonly a: string;
|
||||
readonly concat: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// CHECK_TYPESCRIPT_DECLARATIONS
|
||||
// RUN_PLAIN_BOX_FUNCTION
|
||||
// SKIP_MINIFICATION
|
||||
// SKIP_NODE_JS
|
||||
// IGNORE_BACKEND: JS
|
||||
// INFER_MAIN_MODULE
|
||||
// MODULE: JS_TESTS
|
||||
// FILE: inner-class.kt
|
||||
|
||||
package foo
|
||||
|
||||
@JsExport
|
||||
class TestInner(val a: String) {
|
||||
inner class Inner(val a: String) {
|
||||
val concat: String = this@TestInner.a + this.a
|
||||
|
||||
@JsName("fromNumber")
|
||||
constructor(a: Int): this(a.toString())
|
||||
|
||||
@JsName("SecondLayerInner")
|
||||
inner class InnerInner(val a: String) {
|
||||
val concat: String = this@TestInner.a + this@Inner.a + this.a
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
var TestInner = JS_TESTS.foo.TestInner;
|
||||
function assert(condition) {
|
||||
if (!condition) {
|
||||
throw "Assertion failed";
|
||||
}
|
||||
}
|
||||
function box() {
|
||||
var outer = new TestInner("Hello ");
|
||||
var inner = new outer.Inner("World");
|
||||
var innerFromNumber = outer.Inner.fromNumber(1654);
|
||||
var secondInner = new inner.SecondLayerInner("!");
|
||||
assert(outer instanceof TestInner);
|
||||
assert(inner instanceof TestInner.Inner);
|
||||
assert(innerFromNumber instanceof TestInner.Inner);
|
||||
assert(secondInner instanceof TestInner.Inner.SecondLayerInner);
|
||||
assert(inner.a == "World");
|
||||
assert(inner.concat == "Hello World");
|
||||
assert(innerFromNumber.a == "1654");
|
||||
assert(innerFromNumber.concat == "Hello 1654");
|
||||
assert(secondInner.a == "!");
|
||||
assert(secondInner.concat == "Hello World!");
|
||||
return "OK";
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import TestInner = JS_TESTS.foo.TestInner;
|
||||
|
||||
function assert(condition: boolean) {
|
||||
if (!condition) {
|
||||
throw "Assertion failed";
|
||||
}
|
||||
}
|
||||
|
||||
function box(): string {
|
||||
const outer = new TestInner("Hello ")
|
||||
const inner = new outer.Inner("World")
|
||||
const innerFromNumber = outer.Inner.fromNumber(1654)
|
||||
const secondInner = new inner.SecondLayerInner("!")
|
||||
|
||||
assert(outer instanceof TestInner)
|
||||
assert(inner instanceof TestInner.Inner)
|
||||
assert(innerFromNumber instanceof TestInner.Inner)
|
||||
assert(secondInner instanceof TestInner.Inner.SecondLayerInner)
|
||||
|
||||
assert(inner.a == "World")
|
||||
assert(inner.concat == "Hello World")
|
||||
|
||||
assert(innerFromNumber.a == "1654")
|
||||
assert(innerFromNumber.concat == "Hello 1654")
|
||||
|
||||
assert(secondInner.a == "!")
|
||||
assert(secondInner.concat == "Hello World!")
|
||||
|
||||
return "OK";
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"include": [ "./*" ],
|
||||
"extends": "../common.tsconfig.json"
|
||||
}
|
||||
Reference in New Issue
Block a user