Skip to content

Commit 8b7f4cb

Browse files
committed
Merge branch 'Object.assign-documentation' into Object-docs
2 parents 8aa1415 + a251145 commit 8b7f4cb

File tree

4 files changed

+121
-2
lines changed

4 files changed

+121
-2
lines changed

src/Core__Object.res

+29-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,35 @@ external is: ('a, 'a) => bool = "Object.is"
3434
@val external createWithNull: (@as(json`null`) _, unit) => {..} = "Object.create"
3535
@val external createWithNullAndProperties: (@as(json`null`) _, {..}) => {..} = "Object.create"
3636

37-
@val external assign: ({..}, {..}) => {..} = "Object.assign"
38-
@variadic @val external assignMany: ({..}, array<{..}>) => {..} = "Object.assign"
37+
/**
38+
`assign(target, source)` copies enumerable own properties from the source to the target, overwriting properties with the same name. It returns the modified target object. A deep clone is not created; properties are copied by reference.
39+
40+
**Note:** ReScript provides [first-class support for immutable objects](https://rescript-lang.org/docs/manual/latest/object), including spreading one object into another. This is often more convenient than using `assign`.
41+
42+
See [Object.assign on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) or [ECMAScript Language Specification](https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign).
43+
44+
## Examples
45+
46+
```rescript
47+
Object.assign({"a": 1}, {"a": 2}) // {"a": 2}
48+
Object.assign({"a": 1, "b": 2}, {"a": 0}) // {"a": 0, "b": 2}
49+
Object.assign({"a": 1}, {"a": null}) // {"a": null}
50+
```
51+
*/
52+
@val
53+
external assign: ({..}, {..}) => {..} = "Object.assign"
54+
55+
@variadic
56+
@val
57+
/**
58+
`assignMany(target, sources)` copies enumerable own properties from each source to the target, overwriting properties with the same name. Later sources' properties overwrite earlier ones. It returns the modified target object. A deep clone is not created; properties are copied by reference.
59+
60+
**Note:** ReScript provides [first-class support for immutable objects](https://rescript-lang.org/docs/manual/latest/object), including spreading one object into another. This is often more convenient than using `assign` or `assignMany`.
61+
62+
See [Object.assign on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) or [ECMAScript Language Specification](https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign).
63+
*/
64+
external assignMany: ({..}, array<{..}>) => {..} = "Object.assign"
65+
3966
@val external copy: (@as(json`{}`) _, {..}) => {..} = "Object.assign"
4067

4168
@get_index external get: ({..}, string) => option<'a> = ""

test/ObjectTests.mjs

+68
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,79 @@ Test.run([
397397
"is: bigint"
398398
], BigInt("123") === BigInt("123"), eq, true);
399399

400+
Test.run([
401+
[
402+
"ObjectTests.res",
403+
61,
404+
13,
405+
50
406+
],
407+
"assign copies from source to target"
408+
], Object.assign({
409+
a: 1,
410+
b: 2
411+
}, {
412+
b: 3,
413+
c: 0
414+
}), eq, {
415+
a: 1,
416+
b: 3,
417+
c: 0
418+
});
419+
420+
function assignOverwritesTarget(title, source) {
421+
var sourceObj = {
422+
a: source
423+
};
424+
Test.run([
425+
[
426+
"ObjectTests.res",
427+
69,
428+
22,
429+
39
430+
],
431+
"assign " + title + ""
432+
], Object.assign({
433+
a: 1
434+
}, sourceObj), eq, sourceObj);
435+
Test.run([
436+
[
437+
"ObjectTests.res",
438+
70,
439+
22,
440+
39
441+
],
442+
"assign " + title + ""
443+
], Object.assign({
444+
a: undefined
445+
}, sourceObj), eq, sourceObj);
446+
Test.run([
447+
[
448+
"ObjectTests.res",
449+
71,
450+
22,
451+
39
452+
],
453+
"assign " + title + ""
454+
], Object.assign({
455+
a: null
456+
}, sourceObj), eq, sourceObj);
457+
}
458+
459+
assignOverwritesTarget("when source is undefined", undefined);
460+
461+
assignOverwritesTarget("when source is null", null);
462+
463+
assignOverwritesTarget("when source is a number", 1);
464+
465+
assignOverwritesTarget("when source is a string", "abc");
466+
400467
export {
401468
eq ,
402469
nums ,
403470
d ,
404471
x ,
405472
mkBig ,
473+
assignOverwritesTarget ,
406474
}
407475
/* Not a pure module */

test/ObjectTests.res

+21
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,24 @@ Test.run(__POS_OF__("is: bigint"), Object.is(mkBig("123489"), mkBig("123456789")
5454
Test.run(__POS_OF__("is: bigint"), Object.is(mkBig("000000000"), mkBig("0")), eq, true)
5555
Test.run(__POS_OF__("is: bigint"), mkBig("123") == mkBig("123"), eq, true)
5656
Test.run(__POS_OF__("is: bigint"), mkBig("123") === mkBig("123"), eq, true)
57+
58+
// ====== assign ======
59+
60+
Test.run(
61+
__POS_OF__("assign copies from source to target"),
62+
Object.assign({"a": 1, "b": 2}, {"b": 3, "c": 0}),
63+
eq,
64+
{"a": 1, "b": 3, "c": 0},
65+
)
66+
67+
let assignOverwritesTarget = (~title, ~source) => {
68+
let sourceObj = {"a": source}
69+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": 1}, sourceObj), eq, sourceObj)
70+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": undefined}, sourceObj), eq, sourceObj)
71+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": null}, sourceObj), eq, sourceObj)
72+
}
73+
74+
assignOverwritesTarget(~title="when source is undefined", ~source=undefined)
75+
assignOverwritesTarget(~title="when source is null", ~source=null)
76+
assignOverwritesTarget(~title="when source is a number", ~source=1)
77+
assignOverwritesTarget(~title="when source is a string", ~source="abc")

test/TestSuite.mjs

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ var x = ObjectTests.x;
3939

4040
var mkBig = ObjectTests.mkBig;
4141

42+
var assignOverwritesTarget = ObjectTests.assignOverwritesTarget;
43+
4244
export {
4345
bign ,
4446
TestError ,
@@ -56,5 +58,6 @@ export {
5658
d ,
5759
x ,
5860
mkBig ,
61+
assignOverwritesTarget ,
5962
}
6063
/* IntTests Not a pure module */

0 commit comments

Comments
 (0)