diff --git a/packages/babel-traverse/src/path/index.ts b/packages/babel-traverse/src/path/index.ts index c81e498dd3..18508fd12e 100644 --- a/packages/babel-traverse/src/path/index.ts +++ b/packages/babel-traverse/src/path/index.ts @@ -105,14 +105,14 @@ class NodePath { return this.isScope() ? new Scope(this) : scope; } - setData(key: string, val: any): any { + setData(key: string | symbol, val: any): any { if (this.data == null) { this.data = Object.create(null); } return (this.data[key] = val); } - getData(key: string, def?: any): any { + getData(key: string | symbol, def?: any): any { if (this.data == null) { this.data = Object.create(null); } diff --git a/packages/babel-traverse/src/scope/index.ts b/packages/babel-traverse/src/scope/index.ts index 6a9b8b80c5..98c7bc6a38 100644 --- a/packages/babel-traverse/src/scope/index.ts +++ b/packages/babel-traverse/src/scope/index.ts @@ -824,7 +824,7 @@ export default class Scope { * Set some arbitrary data on the current scope. */ - setData(key: string, val: any) { + setData(key: string | symbol, val: any) { return (this.data[key] = val); } @@ -832,7 +832,7 @@ export default class Scope { * Recursively walk up scope tree looking for the data `key`. */ - getData(key: string): any { + getData(key: string | symbol): any { let scope: Scope = this; do { const data = scope.data[key]; diff --git a/packages/babel-traverse/test/path/index.js b/packages/babel-traverse/test/path/index.js index 5758a13cf8..62a1638f28 100644 --- a/packages/babel-traverse/test/path/index.js +++ b/packages/babel-traverse/test/path/index.js @@ -39,5 +39,13 @@ describe("NodePath", () => { expect(path.getData("__proto__", "test")).toBe("test"); }); + + it("can use symbols as keys", () => { + const path = new NodePath({}, {}); + const symbol = Symbol("foo"); + path.setData(symbol, 42); + + expect(path.getData(symbol)).toBe(42); + }); }); });