TypeScript Type-Exercises 1

    Jan 3, 2024
    • Template String
    type URL:`https://${string}:${port}`
    let a1:URL = 'https://google.com:443' // ok
    let a2:URL = 'https://test' // error
    

    Get the return type of the function

    type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
    
    type T2 = ReturnType<() => string>; // T2 = string
    const sum = (a: number, b: number): number => a + b;
    type T3 = ReturnType<sum>; // T3 = number
    

    Get the parameters type list

    type Parameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never;
    
    type Func = (a: number, b: string) => void;
    type Params = Parameters<Func>;
    // Params = [number, string]
    

    Note: For above two examples they showed the keyword infer's usage.
    Namely you can treat them as a variable that contain the correspond type.
    For example, in type Parameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never , the infer P means storing the types of ...args into P and assigns P's value to the Parameters if T is an function.

    Restrict the variable equals to one of the elements in an Tuple

    const myTuple = ["a", 100, false] as const;
    
    type MyType = (typeof myTuple)[number];
    
    let myVar: MyType;
    // myVar could only be 'a', 100 or false
    

    Note: In this example the myTuple was perceived an readonly tuple and every element are its literal type, namely the first element is the 'a' type rather then string. If you want to make MyType = string | number | boolean you can remove the as const assertion.

    Equal to the first element in a specified tuple.

    type First<T extends any[]> = T extends [infer F, ...infer R] ? F : never;
    
    type MyType = First<["a", 100, false]>;
    // MyType = 'a'
    

    Awaited. Get the type T of Promise<T>

    type Awaited<T extends Promise<any>> = T extends PromiseLike<infer L> ? L : never;
    
    const asyncFunc = async () => {
      return true;
    };
    type MyType = Awaited<asyncFunc>;
    // MyType = boolean.