@momentum-ui/react-collaboration
Version:
Cisco Momentum UI Framework for React Collaboration Applications
39 lines (33 loc) • 1.44 kB
text/typescript
import { ReactNode } from 'react';
import { RequireOneOf } from './types';
import { Equal, Expect } from './typetest.util';
// NOTE: STATIC TYPE TESTS RUN ON LINT
// eslint-disable-next-line @typescript-eslint/no-unused-vars
type cases = [
// If no attributes are defined, type should be never
Expect<Equal<RequireOneOf<{ one: number }, []>, never>>,
// Gets the type of the attribute from the first type parameter
Expect<Equal<RequireOneOf<{ one: number }, ['one']>, { one: number }>>,
// Gets the type and makes the attribute required by removing the ? and removing undefined from the type
Expect<Equal<RequireOneOf<{ one?: number }, ['one']>, { one: number }>>,
Expect<Equal<RequireOneOf<{ one: number | undefined }, ['one']>, { one: number }>>,
// Works with non primitive types and doesn't output any attributes defined in the attribute list
// but not defined in the attribute list that satifies the constrait
Expect<
Equal<
RequireOneOf<
{ a?: string | number; b: ReactNode; c: string; d?: JSX.Element },
['a', 'b', 'c']
>,
{ a: string | number } | { b: ReactNode } | { c: string }
>
>,
// If a union type is defined in the attributes, the option requires both values in the object
// to satify this type
Expect<
Equal<
RequireOneOf<{ a: number; b: number; c: number }, ['a' | 'b', 'c']>,
{ a: number; b: number } | { c: number }
>
>
];