@nestia/fetcher
Version:
Fetcher library of Nestia SDK
81 lines (77 loc) • 2.88 kB
text/typescript
/**
* FormData input type.
*
* `FormDataInput<T>` is a type for the input of the `FormData` request, casting
* `File` property value type as an union of `File` and
* {@link FormDataInput.IFileProps}, especially for the React Native
* environment.
*
* You know what? In the React Native environment, `File` class is not
* supported. Therefore, when composing a `FormData` request, you have to put
* the URI address of the local filesystem with file name and content type that
* is represented by the {@link FormDataInput.IFileProps} type.
*
* This `FormDataInput<T>` type is designed for that purpose. If the property
* value type is a `File` class, it converts it to an union type of `File` and
* {@link FormDataInput.IFileProps} type. Also, if the property value type is an
* array of `File` class, it converts it to an array of union type of `File` and
* {@link FormDataInput.IFileProps} type too.
*
* Before | After ----------|------------------------ `boolean` | `boolean`
* `bigint` | `bigint` `number` | `number` `string` | `string` `File` | `File \|
* IFileProps`
*
* @author Jeongho Nam - https://github.com/samchon
* @template T Target object type.
*/
export type FormDataInput<T extends object> =
T extends Array<any>
? never
: T extends Function
? never
: {
[P in keyof T]: T[P] extends Array<infer U>
? FormDataInput.Value<U>[]
: FormDataInput.Value<T[P]>;
};
export namespace FormDataInput {
/**
* Value type of the `FormDataInput`.
*
* `Value<T>` is a type for the property value defined in the `FormDataInput`.
*
* If the original value type is a `File` class, `Value<T>` converts it to an
* union type of `File` and {@link IFileProps} type which is a structured data
* for the URI file location in the React Native environment.
*/
export type Value<T> = T extends File ? T | IFileProps : T;
/**
* Properties of a file.
*
* In the React Native, this `IFileProps` structured data can replace the
* `File` class instance in the `FormData` request.
*
* Just put the {@link uri URI address} of the local file system with the
* file's {@link name} and {@link type}. It would be casted to the `File` class
* instance automatically in the `FormData` request.
*
* Note that, this `IFileProps` type works only in the React Native
* environment. If you are developing a Web or NodeJS application, you have to
* utilize the `File` class instance directly.
*/
export interface IFileProps {
/**
* URI address of the file.
*
* In the React Native, the URI address in the local file system can replace
* the `File` class instance. If
*
* @format uri
*/
uri: string;
/** Name of the file. */
name: string;
/** Content type of the file. */
type: string;
}
}