Code viewer for World: Edge Cases: TypeScript (Pure)
/* -----------------------------
   1. Type Inference & Narrowing
   ----------------------------- */
function typeNarrowingTest(value: string | number | null): void {
    if (typeof value === "string") {
        document.write(`<p>String detected. Length: ${value.length}</p>`);
    } else if (typeof value === "number") {
        document.write(`<p>Number detected. Squared: ${value * value}</p>`);
    } else {
        document.write(`<p>Null detected!</p>`);
    }
}

/* Run type narrowing test */
typeNarrowingTest("hello");
typeNarrowingTest(7);
typeNarrowingTest(null);

/* -----------------------------
   2. Generics & Type Constraints
   ----------------------------- */
function identity<T>(value: T): T {
    return value;
}

/* Run generics test */
document.write(`<p>Generic string: ${identity("TypeScript")}</p>`);
document.write(`<p>Generic number: ${identity(123)}</p>`);
document.write(`<p>Generic array: ${identity([1, 2, 3]).join(", ")}</p>`);

/* -----------------------------
   3. Async/Await with Errors
   ----------------------------- */
async function delayedValue(n: number): Promise<number> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() < 0.3) reject("Random failure!");
            else resolve(n * 2);
        }, 500);
    });
}

async function asyncTest(): Promise<void> {
    try {
        const result = await delayedValue(10);
        document.write(`<p>Async success: ${result}</p>`);
    } catch (err) {
        document.write(`<p style="color:red;">Async error: ${err}</p>`);
    }
}

/* Run async/await test */
asyncTest();

/* -----------------------------
   4. Combined Stress Test
   ----------------------------- */
async function combinedTest<T extends number>(value: T): Promise<T> {
    return new Promise((resolve) => setTimeout(() => resolve((value * 2) as T), 300));
}

async function runCombinedTest(): Promise<void> {
    const nums: number[] = [1, 2, 3, 4, 5];
    const doubled = await Promise.all(nums.map(combinedTest));
    document.write(`<h3>Combined test results:</h3>`);
    document.write(`<pre>${JSON.stringify(doubled, null, 2)}</pre>`);
}

/* Run combined test */
runCombinedTest();