Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 2f8570d

Browse filesBrowse files
authored
Give Records a displayName (immutable-js#1625)
This ensures Records are printed correctly in debugging contexts and provides a better mechanism for accessing a Record class's record name. Deprecates the _name field on Record instances
1 parent 8476038 commit 2f8570d
Copy full SHA for 2f8570d

File tree

Expand file treeCollapse file tree

4 files changed

+23
-1
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+23
-1
lines changed

‎__tests__/Record.ts

Copy file name to clipboardExpand all lines: __tests__/Record.ts
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ describe('Record', () => {
3232
const me = Person({ name: 'My Name' });
3333
expect(me.toString()).toEqual('Person { name: "My Name" }');
3434
expect(Record.getDescriptiveName(me)).toEqual('Person');
35+
expect(Person.displayName).toBe('Person');
3536
});
3637

3738
it('passes through records of the same type', () => {

‎__tests__/RecordJS.js

Copy file name to clipboardExpand all lines: __tests__/RecordJS.js
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ describe('Record', () => {
5252
expect(t instanceof Alphabet);
5353
expect(t.soup()).toBe(6);
5454
expect(t2.soup()).toBe(204);
55+
56+
// Uses class name as descriptive name
57+
expect(Record.getDescriptiveName(t)).toBe('Alphabet');
58+
59+
// Uses display name over class name
60+
class NotADisplayName extends Record({ x: 1 }, 'DisplayName') {}
61+
const t3 = new NotADisplayName();
62+
expect(Record.getDescriptiveName(t3)).toBe('DisplayName');
5563
});
5664

5765
it('can be cleared', () => {

‎src/Record.js

Copy file name to clipboardExpand all lines: src/Record.js
+8-1Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ export class Record {
4444
hasInitialized = true;
4545
const keys = Object.keys(defaultValues);
4646
const indices = (RecordTypePrototype._indices = {});
47+
// Deprecated: left to attempt not to break any external code which
48+
// relies on a ._name property existing on record instances.
49+
// Use Record.getDescriptiveName() instead
4750
RecordTypePrototype._name = name;
4851
RecordTypePrototype._keys = keys;
4952
RecordTypePrototype._defaultValues = defaultValues;
@@ -81,6 +84,10 @@ export class Record {
8184
));
8285
RecordTypePrototype.constructor = RecordType;
8386

87+
if (name) {
88+
RecordType.displayName = name;
89+
}
90+
8491
return RecordType;
8592
}
8693

@@ -220,7 +227,7 @@ function makeRecord(likeRecord, values, ownerID) {
220227
}
221228

222229
function recordName(record) {
223-
return record._name || record.constructor.name || 'Record';
230+
return record.constructor.displayName || record.constructor.name || 'Record';
224231
}
225232

226233
function recordSeq(record) {

‎type-definitions/Immutable.d.ts

Copy file name to clipboardExpand all lines: type-definitions/Immutable.d.ts
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,6 +2446,12 @@ declare module Immutable {
24462446
export interface Factory<TProps extends Object> {
24472447
(values?: Partial<TProps> | Iterable<[string, any]>): Record<TProps> & Readonly<TProps>;
24482448
new (values?: Partial<TProps> | Iterable<[string, any]>): Record<TProps> & Readonly<TProps>;
2449+
2450+
/**
2451+
* The name provided to `Record(values, name)` can be accessed with
2452+
* `displayName`.
2453+
*/
2454+
displayName: string;
24492455
}
24502456

24512457
export function Factory<TProps extends Object>(values?: Partial<TProps> | Iterable<[string, any]>): Record<TProps> & Readonly<TProps>;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.