理解できないのはソースの以下の箇所です。
https://github.com/vercel/swr/blob/master/src/types.ts#L6-L32
typescript
1export type Fetcher<Data = unknown, SWRKey extends Key = Key> = 2 /** 3 * () => [{ foo: string }, { bar: number }] | null 4 * () => ( [{ foo: string }, { bar: number } ] as const | null ) 5 */ 6 SWRKey extends (() => readonly [...infer Args] | null) 7 ? ((...args: [...Args]) => FetcherResponse<Data>) 8 /** 9 * [{ foo: string }, { bar: number } ] | null 10 * [{ foo: string }, { bar: number } ] as const | null 11 */ 12 : SWRKey extends (readonly [...infer Args]) 13 ? ((...args: [...Args]) => FetcherResponse<Data>) 14 /** 15 * () => string | null 16 * () => Record<any, any> | null 17 */ 18 : SWRKey extends (() => infer Arg | null) 19 ? (...args: [Arg]) => FetcherResponse<Data> 20 /** 21 * string | null | Record<any,any> 22 */ 23 : SWRKey extends null 24 ? never 25 : SWRKey extends (infer Arg) 26 ? (...args: [Arg]) => FetcherResponse<Data> 27 : never
useSWRの第一引数によって第二引数のFetcherの型が決まります。
ここで第一引数がnullだった場合、下から4行目のneverに入ってコンパイルエラーになるように見えるのですが、実際はnullが入ってもその他の分岐(どこか不明)に入って成立しています。
なぜneverの分岐に入らずこのような動作になるのでしょうか。
ご教示いただけると大変助かります。
よろしくお願いいたします。
useSWRの定義
追っていくと以下にあたります。
https://github.com/vercel/swr/blob/da33f52633ef5bb357e074de8499c76661e23c78/src/use-swr.ts#L512
withArgs
自体の定義は以下です。
typescript
1export const withArgs = <SWRType>(hook: any) => { 2 return (((...args: any) => { 3 // Normalize arguments. 4 const [key, fn, _config] = normalize<any, any>(args) 5 6 // Get the default and inherited configuration. 7 const fallbackConfig = mergeObjects( 8 defaultConfig, 9 useContext(SWRConfigContext) 10 ) 11 12 // Merge configurations. 13 const config = mergeConfigs(fallbackConfig, _config) 14 15 // Apply middleware 16 let next = hook 17 const { use } = config 18 if (use) { 19 for (let i = use.length; i-- > 0; ) { 20 next = use[i](next) 21 } 22 } 23 24 return next(key, fn || config.fetcher, config) 25 }) as unknown) as SWRType 26}
回答1件
あなたの回答
tips
プレビュー