// @strict: true // @filename: node_modules/prop-types/index.d.ts export const nominalTypeHack: unique symbol; export type IsOptional = undefined | null extends T ? true : undefined extends T ? true : null extends T ? true : false; export type RequiredKeys = { [K in keyof V]-?: Exclude extends Validator ? IsOptional extends true ? never : K : never }[keyof V]; export type OptionalKeys = Exclude>; export type InferPropsInner = { [K in keyof V]-?: InferType; }; export interface Validator { (props: object, propName: string, componentName: string, location: string, propFullName: string): Error | null; [nominalTypeHack]?: T; } export interface Requireable extends Validator { isRequired: Validator>; } export type ValidationMap = { [K in keyof T]?: Validator }; export type InferType = V extends Validator ? T : any; export type InferProps = & InferPropsInner>> & Partial>>>; export const any: Requireable; export const array: Requireable; export const bool: Requireable; export const string: Requireable; export const number: Requireable; export function shape

>(type: P): Requireable>; export function oneOfType>(types: T[]): Requireable>>; // @filename: file.ts import * as PropTypes from "prop-types"; interface Props { any?: any; array: string[]; bool: boolean; shape: { foo: string; bar?: boolean; baz?: any }; oneOfType: string | boolean | { foo?: string; bar: number; }; } type PropTypesMap = PropTypes.ValidationMap; const innerProps = { foo: PropTypes.string.isRequired, bar: PropTypes.bool, baz: PropTypes.any }; const arrayOfTypes = [PropTypes.string, PropTypes.bool, PropTypes.shape({ foo: PropTypes.string, bar: PropTypes.number.isRequired })]; // TS checking const propTypes: PropTypesMap = { any: PropTypes.any, array: PropTypes.array.isRequired, bool: PropTypes.bool.isRequired, shape: PropTypes.shape(innerProps).isRequired, oneOfType: PropTypes.oneOfType(arrayOfTypes).isRequired, }; // JS checking const propTypesWithoutAnnotation = { any: PropTypes.any, array: PropTypes.array.isRequired, bool: PropTypes.bool.isRequired, shape: PropTypes.shape(innerProps).isRequired, oneOfType: PropTypes.oneOfType(arrayOfTypes).isRequired, }; type ExtractedProps = PropTypes.InferProps; type ExtractedPropsWithoutAnnotation = PropTypes.InferProps; type ExtractPropsMatch = ExtractedProps extends ExtractedPropsWithoutAnnotation ? true : false; const x: true = (null as any as ExtractPropsMatch);