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