In TypeScript, how can I tell the type system I know that in theory this value may have these multiple types, but in practice I know it will only have this one
TypeScript allows you to use union types based on several existing types (called member types). For example,  a function that works with strings or numbers could be defined as ```function printId(id: number | string)```.

A value matches a union type if it matches any of the union type's members. In the given example, the first parameter to `printId` (that is, `id`) can be either `number` or `string`.

TypeScript will only allow operations on a value of a union type in two conditions.
(1) If it is valid for every member of the union, OR 
(2) If you write some code which allows TypeScript to deduce the specific type. For example, code in a conditional like ```if (typeof id === string) {}``` can perform any operation that is valid on strings. In this way you can use code to tell TypeScript that certain code only applies when the value has one specific type. This is called narrowing. You do not need to define anything special to do this.

If you want TypeScript to check at compile time that a certain value has a certain type, you can always use type assertions. For example, ```const myCanvas = document.getElementById(main_canvas) as HTMLCanvasElement;``` puts in an assertion that the result of the `getElementById` call is always expected to be of type `HTMLCanvasElement`. These type assertions are removed at compile time, but you may find them helpful if narrowing is not enough for you.
How can I do this in Javascript?
In JavaScript, you can't directly specify a variable's type in the same way you can in TypeScript. However, you can achieve a similar effect by using type checking and type conversion techniques.

To specify that a value can have multiple types but you know it will only have one in practice, you can use type checking and type conversion techniques to enforce the expected type at runtime. Here's an example:

        let value = hello;
        if (typeof value === string) {
          let length = value.length;
          console.log(length); // Output: 5
        } else {
          console.log(Expected a string value.);
        }

In this example, the value variable is assigned a string value. We can check the type of value using the typeof operator, and then conditionally access the length property only if value is a string. If value were anything else, such as a number or an object, the code would skip the if block and log an error message instead.

This technique isn't as powerful or expressive as TypeScript's type system, but it can still help catch certain types of bugs and make your code more reliable. If you need more advanced type checking or type conversion capabilities, you can consider using a library or framework that provides them, such as lodash or ramda.
Why would I use typescript instead of javascript if I don't have to specify types in javscript?