Skip to content

Commit a3be235

Browse files
Merge pull request #192 from SoftwareBrothers/predict-ts-functions-types
feat: predict ts functions types
2 parents 56d9a06 + 1137747 commit a3be235

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

fixtures/typescript/functions.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Add
3+
*/
4+
function add(x: number, y: number): number {
5+
return x + y;
6+
}
7+
8+
/**
9+
* My Add
10+
*/
11+
let myAdd = function (x: number, y: number): number {
12+
return x + y;
13+
};

typescript/type-converter.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,31 @@ const getName = (node, src) => {
5050
return name
5151
}
5252

53+
/**
54+
* Check type of node (dev only)
55+
* @param {node} node
56+
* @return {void} Console log predicted types
57+
*/
58+
function checkType(node) {
59+
console.group(node.name?.escapedText);
60+
const predictedTypes = Object.keys(ts).reduce((acc, key) => {
61+
if (typeof ts[key] !== "function" && !key.startsWith("is")) {
62+
return acc;
63+
}
64+
try {
65+
if (ts[key](node) === true) {
66+
acc.push(key);
67+
}
68+
} catch (error) {
69+
return acc;
70+
}
71+
return acc;
72+
}, []);
73+
console.log(predictedTypes);
74+
console.groupEnd();
75+
}
76+
77+
5378
/**
5479
* Fill missing method declaration
5580
*
@@ -65,10 +90,10 @@ const fillMethodComment = (comment, member, src) => {
6590
if (!comment.includes('@param')) {
6691
comment = convertParams(comment, member, src)
6792
}
68-
if (ts.isArrayTypeNode(member.type)) {
93+
if (member.type && ts.isArrayTypeNode(member.type)) {
6994
comment = convertMembers(comment, member.type, src)
7095
}
71-
if (!comment.includes('@return')) {
96+
if (member.type && !comment.includes('@return')) {
7297
const returnType = getTypeName(member.type, src)
7398
comment = appendComment(comment, `@return {${returnType}}`)
7499
}
@@ -175,7 +200,9 @@ module.exports = function typeConverter(src, filename = 'test.ts') {
175200
if (jsDocNode) {
176201
let comment = src.substring(jsDocNode.pos, jsDocNode.end)
177202
const name = getName(statement, src)
178-
203+
if (ts.isFunctionDeclaration(statement)) {
204+
return fillMethodComment(comment, statement, src);
205+
}
179206
if (ts.isTypeAliasDeclaration(statement)) {
180207
if (ts.isFunctionTypeNode(statement.type)) {
181208
comment = appendComment(comment, `@typedef {function} ${name}`)
@@ -238,7 +265,7 @@ module.exports = function typeConverter(src, filename = 'test.ts') {
238265
const type = getTypeName(member.type, src)
239266
memberComment = appendComment(memberComment, `@type {${type}}`)
240267
}
241-
if (member.type && ts.isFunctionLike(member)) {
268+
if (ts.isFunctionLike(member)) {
242269
memberComment = fillMethodComment(memberComment, member, src)
243270
}
244271
if (modifiers.find((m => m === 'static'))) {

0 commit comments

Comments
 (0)