Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit d6d7d1e

Browse files
authoredNov 4, 2016
feat: add partial support for onOf propType (#218)
1 parent c2a2542 commit d6d7d1e

File tree

4 files changed

+17
-1
lines changed

4 files changed

+17
-1
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Create typescript definitions files (d.ts) from react components.
1616
* ES6 and ES7 class syntax
1717
* Most PropTypes
1818
* any, array, bool, func, number, object, string, node, element, oneOfType, arrayOf, symbol
19+
* Partial support for oneOf PropType
1920
* required PropTypes
2021
* instanceOf PropTypes (when using API and giving a resolve function)
2122
* jsdoc

‎src/types.ts

+14
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ export function get(astq: astqts.ASTQ, propertyAst: any, propTypesName: string|u
5555
case 'arrayOf':
5656
const typeDecl = get(astq, typeAst.arguments[0], propTypesName);
5757
return getTypeDeclaration(dom.create.array(typeDecl.type), !required);
58+
case 'oneOf':
59+
// FIXME: This should better be a real enum
60+
const enumEntries = getEnumValues(typeAst.arguments[0].elements);
61+
return getTypeDeclaration(dom.create.union(enumEntries as dom.Type[]), !required);
5862
}
5963

6064
return {
@@ -95,3 +99,13 @@ function getComplexTypeName(astq: astqts.ASTQ, propertyAst: any,
9599
}
96100
return [required, undefined, typeAst];
97101
}
102+
103+
function getEnumValues(oneOfTypes: any[]): any[] {
104+
return oneOfTypes.map((element: any) => {
105+
// FIXME: This are not named references!
106+
if (element.type === 'StringLiteral') {
107+
return dom.create.namedTypeReference(`'${element.value}'`);
108+
}
109+
return dom.create.namedTypeReference(element.value);
110+
});
111+
}

‎tests/es6-class.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ declare module 'component' {
1515
optionalNode?: React.ReactNode;
1616
optionalElement?: React.ReactElement<any>;
1717
optionalMessage?: typeof Message;
18+
optionalEnum?: 'News' | 'Photos' | 1 | 2;
1819
optionalUnion?: string | number;
1920
optionalArrayOf?: number[];
2021
requiredFunc: (...args: any[])=>any;

‎tests/es6-class.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Component.propTypes = {
2323
optionalNode: React.PropTypes.node,
2424
optionalElement: React.PropTypes.element,
2525
optionalMessage: React.PropTypes.instanceOf(Message),
26-
//optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
26+
optionalEnum: React.PropTypes.oneOf(['News', 'Photos', 1, 2]),
2727
optionalUnion: React.PropTypes.oneOfType([
2828
React.PropTypes.string,
2929
React.PropTypes.number

0 commit comments

Comments
 (0)
This repository has been archived.