Skip to content

Commit dbe902f

Browse files
authored
feat: wrap OptionalTypeNode (#1647)
1 parent c08da16 commit dbe902f

File tree

7 files changed

+51
-0
lines changed

7 files changed

+51
-0
lines changed

packages/ts-morph/lib/ts-morph.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4194,6 +4194,8 @@ export declare class Node<NodeType extends ts.Node = ts.Node> {
41944194
static isNodeWithTypeArguments(node: Node | undefined): node is NodeWithTypeArguments;
41954195
/** Gets if the node is a NullLiteral. */
41964196
static isNullLiteral(node: Node | undefined): node is NullLiteral;
4197+
/** Gets if the node is a OptionalTypeNode. */
4198+
static isOptionalTypeNode(node: Node | undefined): node is OptionalTypeNode;
41974199
/** Gets if the node is a OverloadableNode. */
41984200
static isOverloadable<T extends Node>(node: T | undefined): node is OverloadableNode & OverloadableNodeExtensionType & T;
41994201
/** Gets if the node is a OverrideableNode. */
@@ -6513,6 +6515,7 @@ export interface ImplementedKindToNodeMappings {
65136515
[SyntaxKind.ObjectBindingPattern]: ObjectBindingPattern;
65146516
[SyntaxKind.ObjectLiteralExpression]: ObjectLiteralExpression;
65156517
[SyntaxKind.OmittedExpression]: OmittedExpression;
6518+
[SyntaxKind.OptionalType]: OptionalTypeNode;
65166519
[SyntaxKind.Parameter]: ParameterDeclaration;
65176520
[SyntaxKind.ParenthesizedExpression]: ParenthesizedExpression;
65186521
[SyntaxKind.ParenthesizedType]: ParenthesizedTypeNode;
@@ -8752,6 +8755,15 @@ export declare class NamedTupleMember extends NamedTupleMemberBase<ts.NamedTuple
87528755
getParentOrThrow(message?: string | (() => string)): NonNullable<NodeParentType<ts.NamedTupleMember>>;
87538756
}
87548757

8758+
export declare class OptionalTypeNode extends TypeNode<ts.OptionalTypeNode> {
8759+
/** Gets the optional type node's inner type. */
8760+
getTypeNode(): TypeNode<ts.TypeNode>;
8761+
/** @inheritdoc **/
8762+
getParent(): NodeParentType<ts.OptionalTypeNode>;
8763+
/** @inheritdoc **/
8764+
getParentOrThrow(message?: string | (() => string)): NonNullable<NodeParentType<ts.OptionalTypeNode>>;
8765+
}
8766+
87558767
export declare class ParenthesizedTypeNode extends TypeNode<ts.ParenthesizedTypeNode> {
87568768
/** Gets the node within the parentheses. */
87578769
getTypeNode(): TypeNode;

packages/ts-morph/src/compiler/ast/common/Node.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,6 +3481,11 @@ export class Node<NodeType extends ts.Node = ts.Node> {
34813481
/** Gets if the node is a OmittedExpression. */
34823482
static readonly isOmittedExpression: (node: compiler.Node | undefined) => node is compiler.OmittedExpression = Node.is(SyntaxKind.OmittedExpression);
34833483

3484+
/** Gets if the node is a OptionalTypeNode. */
3485+
static isOptionalTypeNode(node: compiler.Node | undefined): node is compiler.OptionalTypeNode {
3486+
return node?.getKind() === SyntaxKind.OptionalType;
3487+
}
3488+
34843489
/** Gets if the node is a OverloadableNode. */
34853490
static isOverloadable<T extends compiler.Node>(node: T | undefined): node is compiler.OverloadableNode & compiler.OverloadableNodeExtensionType & T {
34863491
switch (node?.getKind()) {
@@ -4085,6 +4090,7 @@ export class Node<NodeType extends ts.Node = ts.Node> {
40854090
case SyntaxKind.LiteralType:
40864091
case SyntaxKind.MappedType:
40874092
case SyntaxKind.NamedTupleMember:
4093+
case SyntaxKind.OptionalType:
40884094
case SyntaxKind.ParenthesizedType:
40894095
case SyntaxKind.RestType:
40904096
case SyntaxKind.TemplateLiteralType:

packages/ts-morph/src/compiler/ast/kindToNodeMappings.generated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ export interface ImplementedKindToNodeMappings {
144144
[SyntaxKind.ObjectBindingPattern]: compiler.ObjectBindingPattern;
145145
[SyntaxKind.ObjectLiteralExpression]: compiler.ObjectLiteralExpression;
146146
[SyntaxKind.OmittedExpression]: compiler.OmittedExpression;
147+
[SyntaxKind.OptionalType]: compiler.OptionalTypeNode;
147148
[SyntaxKind.Parameter]: compiler.ParameterDeclaration;
148149
[SyntaxKind.ParenthesizedExpression]: compiler.ParenthesizedExpression;
149150
[SyntaxKind.ParenthesizedType]: compiler.ParenthesizedTypeNode;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ts } from "@ts-morph/common";
2+
import { TypeNode } from "./TypeNode";
3+
4+
export class OptionalTypeNode extends TypeNode<ts.OptionalTypeNode> {
5+
/** Gets the optional type node's inner type. */
6+
getTypeNode() {
7+
return this._getNodeFromCompilerNode(this.compilerNode.type);
8+
}
9+
}

packages/ts-morph/src/compiler/ast/type/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export * from "./IntersectionTypeNode";
1111
export * from "./LiteralTypeNode";
1212
export * from "./MappedTypeNode";
1313
export * from "./NamedTupleMember";
14+
export * from "./OptionalTypeNode";
1415
export * from "./ParenthesizedTypeNode";
1516
export * from "./RestTypeNode";
1617
export * from "./TemplateLiteralTypeNode";

packages/ts-morph/src/factories/kindToWrapperMappings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ export const kindToWrapperMappings: { [key: number]: unknown } = {
145145
[SyntaxKind.ObjectBindingPattern]: compiler.ObjectBindingPattern,
146146
[SyntaxKind.ObjectLiteralExpression]: compiler.ObjectLiteralExpression,
147147
[SyntaxKind.OmittedExpression]: compiler.OmittedExpression,
148+
[SyntaxKind.OptionalType]: compiler.OptionalTypeNode,
148149
[SyntaxKind.Parameter]: compiler.ParameterDeclaration,
149150
[SyntaxKind.ParenthesizedExpression]: compiler.ParenthesizedExpression,
150151
[SyntaxKind.ParenthesizedType]: compiler.ParenthesizedTypeNode,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { nameof, SyntaxKind } from "@ts-morph/common";
2+
import { expect } from "chai";
3+
import { OptionalTypeNode } from "../../../../compiler";
4+
import { getInfoFromTextWithDescendant } from "../../testHelpers";
5+
6+
describe("OptionalTypeNode", () => {
7+
function getNode(text: string) {
8+
return getInfoFromTextWithDescendant<OptionalTypeNode>(text, SyntaxKind.OptionalType);
9+
}
10+
11+
describe(nameof<OptionalTypeNode>("getTypeNode"), () => {
12+
function doTest(text: string, expected: string) {
13+
const { descendant } = getNode(text);
14+
expect(descendant.getTypeNode().getText()).to.equal(expected);
15+
}
16+
17+
it("should get the type", () => {
18+
doTest("type T = [string, number?]", "number");
19+
});
20+
});
21+
});

0 commit comments

Comments
 (0)