DefinitelyTyped/types/react-combine-reducers/react-combine-reducers-tests.ts
Raphaël L 368934537f
Add types for package react-combine-reducers (#43749)
* Add types for react-combine-reducer

* Run prettier on react-combine-reducers

* Fix linter issues
2020-04-10 19:42:19 -07:00

233 lines
4.4 KiB
TypeScript

import combineReducers from 'react-combine-reducers';
interface SimpleAction {
type: string;
payload: any;
}
interface GreeniesState {
fruit: 'apple' | 'pear' | 'kiwi';
vegetable: 'carrot' | 'eggplant';
}
interface ProteinsState {
similiCarne: 'tofu' | 'seitan';
vegetable: 'bean' | 'artichoke';
}
interface DrinkState {
beverage: 'water' | 'juice';
numberOfGlasses: number;
}
interface DessertState {
cake: 'chocolate' | 'cherry';
drink: 'tea' | 'coffee';
}
interface FullMealState {
proteins: ProteinsState;
greenies: GreeniesState;
dessert: DessertState;
drink: DrinkState;
}
type FullMealReducer = (state: FullMealState, action: SimpleAction) => FullMealState;
const proteinsReducer = (proteinsState: ProteinsState, action: SimpleAction) => {
switch (action) {
default:
return proteinsState;
}
};
const drinkReducer = (drinkState: DrinkState, action: SimpleAction) => {
switch (action) {
default:
return drinkState;
}
};
const dessertReducer = (dessertState: DessertState, action: SimpleAction) => {
switch (action) {
default:
return dessertState;
}
};
const greeniesReducer = (greeniesState: GreeniesState, action: SimpleAction) => {
switch (action) {
default:
return greeniesState;
}
};
// $ExpectError
combineReducers('');
// $ExpectError
combineReducers<FullMealReducer>({});
// $ExpectError
combineReducers<FullMealReducer>();
combineReducers<FullMealReducer>({
// $ExpectError
books: ['The Book Thief'],
});
combineReducers<FullMealReducer>({
// $ExpectError
proteins: [100],
});
combineReducers<FullMealReducer>({
// $ExpectError
proteins: [3, proteinsReducer],
});
combineReducers<FullMealReducer>({
// $ExpectError
proteins: [proteinsReducer, 3],
});
// $ExpectError
combineReducers<FullMealReducer>({
proteins: [
proteinsReducer,
{
similiCarne: 'tofu',
vegetable: 'artichoke',
},
],
});
combineReducers<FullMealReducer>({
proteins: [
proteinsReducer,
{
similiCarne: 'tofu',
vegetable: 'artichoke',
},
],
greenies: [
// $ExpectError
proteinsReducer,
{
fruit: 'kiwi',
vegetable: 'eggplant',
},
],
drink: [
// $ExpectError
proteinsReducer,
{
beverage: 'juice',
numberOfGlasses: 2,
},
],
dessert: [
// $ExpectError
proteinsReducer,
{
cake: 'chocolate',
drink: 'tea',
},
],
});
const [fullMealReducer, initialMeal] = combineReducers<FullMealReducer>({
proteins: [
proteinsReducer,
{
similiCarne: 'tofu',
vegetable: 'artichoke',
},
],
greenies: [
greeniesReducer,
{
fruit: 'kiwi',
vegetable: 'eggplant',
},
],
drink: [
drinkReducer,
{
beverage: 'juice',
numberOfGlasses: 2,
},
],
dessert: [
dessertReducer,
{
cake: 'chocolate',
drink: 'tea',
},
],
});
initialMeal.dessert;
initialMeal.drink;
initialMeal.proteins;
initialMeal.greenies;
// $ExpectError
initialMeal.lamps;
// $ExpectError
fullMealReducer(3, {});
// $ExpectError
fullMealReducer({}, {});
fullMealReducer(
{
proteins: {
similiCarne: 'tofu',
vegetable: 'artichoke',
},
greenies: {
fruit: 'kiwi',
vegetable: 'eggplant',
},
drink: {
beverage: 'juice',
numberOfGlasses: 2,
},
dessert: {
cake: 'chocolate',
drink: 'tea',
},
},
// $ExpectError
67,
);
fullMealReducer(
{
proteins: {
similiCarne: 'tofu',
vegetable: 'artichoke',
},
greenies: {
fruit: 'kiwi',
vegetable: 'eggplant',
},
drink: {
beverage: 'juice',
numberOfGlasses: 2,
},
dessert: {
cake: 'chocolate',
drink: 'tea',
},
},
{
type: 'eat',
payload: 'everything',
},
);
export { fullMealReducer, initialMeal };