/* -----------------------------
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();