ts-morph

Function Declarations

Functions can be retrieved from source files, other namespaces, or function bodies:

const functions = sourceFile.getFunctions();
const function1 = sourceFile.getFunction("Function1");
const firstFunctionWithChildFunction = sourceFile.getFunction(f => f.getFunctions().length > 0);

Most of the information you can get about functions is covered in other sections.

Name

It's important to note that function declarations may not have a name. For example:

export default function() {
  // etc...
}

For this reason, the methods like .getName() and .getNameNode() are nullable on FunctionDeclaration.

Add/Insert

Add or insert functions to a source file, namespace, or function like declarations by calling addFunction(), addFunctions(), insertFunction(), or insertFunctions().

const functionDeclaration = sourceFile.addFunction({
  name: "FunctionName",
});

Remove

Call .remove():

functionDeclaration.remove();

Overloads

By default, in ambient contexts or for ambient nodes, all overloads will be returned. In non-ambient contexts, only the implementation will be returned.

Get the overloads by calling:

const overloads = functionDeclaration.getOverloads(); // returns: FunctionDeclaration[]

Or tell if the current declaration is an overload by calling either:

functionDeclaration.isOverload();
functionDeclaration.isImplementation();

From the overloads, get the implementation by calling:

const implementation = functionOverload.getImplementation();

Add/Insert

Add or insert overloads by using either the .addOverload(), .addOverloads(), .insertOverload(), or insertOverloads() methods.

Remove

Call .remove() on the overload:

functionOverload.remove();

Set body text

The body text can be set via the .setBodyText() method:

functionDeclaration.setBodyText("const myNumber = 5;");

Or alternatively, write the body text with code-block-writer:

functionDeclaration.setBodyText(writer =>
  writer.writeLine("const myNumber = 5;")
    .write("if (myNumber === 5)").block(() => {
      writer.writeLine("console.log('yes')");
    })
);

Using the writer is very useful because it will write code out using the indentation and newline settings of the AST. It's also easier to use.

Get body text

This returns the body text without leading indentation or leading and trailing whitespace.

console.log(functionDeclaration.getBodyText());

Unwrap

A function declaration can be replaced with its body using the .unwrap() method.

Given the following code:

function someFunction() {
  function innerFunction() {
  }

  const someDeclaration = 5;
}

Calling .unwrap() on the function will change the code to the following:

function innerFunction() {
}

const someDeclaration = 5;

Function Expressions

They exist in an expression:

const add = function(a: number, b: number) {
  return a + b;
};

In this case, it can be retrieved via the variable declaration's initializer.

const functionExpression = sourceFile.getVariableDeclarationOrThrow("add")
  .getInitializerIfKindOrThrow(SyntaxKind.FunctionExpression);