Varför uppfyller Typescripts "typeof function" villkoret "extends (...args: any[]) => any" för generiska typer


Givet följande kod:

type Params<F extends (...args: any[]) => any> =
    F extends ((...args: infer A) => any)
    ? A
    : never;

const fn00 = (name: string, age: number, single: boolean) => true

type test07 = Params<typeof fn00>

Varför uppfyller typeof fn00 den generiska begränsningen av (...args: any[]) => any.

Enligt dokumentationen returnerar typeof-operatorn endast strängar av typen som undersöks. I princip:

"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"

Dokumentationen för typeof finns här: https://www.typescriptlang.org/docs/handbook/advanced-types.html#typeof-type-guards

Svar #1

Det finns egentligen två typeof-operatorer. Den ena finns i uttryck, och det är Javascript typeof-operatorn. Denna operator returnerar, som dokumentationen säger, ett av dessa möjliga värden.

Den andra typeof-operatorn finns i typer och returnerar (vid kompileringstid) TypeScript-typen för ett värde (variabel, klass, funktion etc). TypeScript-typen för fn00 är (name: string, age: number, single: boolean) => boolean och så i typen type test07=Params<typeof fn00>, kommer typeof fn00 att vara denna typ.

Om du skulle använda typeof i ett uttryck (t.ex. const test=typeof fn00), skulle du faktiskt få bara function