• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//// [objectSpreadStrictNull.ts]
2function f(
3    definiteBoolean: { sn: boolean },
4    definiteString: { sn: string },
5    optionalString: { sn?: string },
6    optionalNumber: { sn?: number },
7    undefinedString: { sn: string | undefined },
8    undefinedNumber: { sn: number | undefined }) {
9    // optional
10    let optionalUnionStops: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalNumber };
11    let optionalUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...optionalString, ...optionalNumber };
12    let allOptional: { sn?: string | number } = { ...optionalString, ...optionalNumber };
13
14    // undefined
15    let undefinedUnionStops: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...undefinedNumber };
16    let undefinedUnionDuplicates: { sn: string | number } = { ...definiteBoolean, ...definiteString, ...undefinedString, ...undefinedNumber };
17    let allUndefined: { sn: string | number | undefined } = { ...undefinedString, ...undefinedNumber };
18
19    let undefinedWithOptionalContinues: { sn: string | number | boolean } = { ...definiteBoolean, ...undefinedString, ...optionalNumber };
20}
21
22type Movie = {
23    title: string;
24    yearReleased: number;
25}
26
27const m = { title: "The Matrix", yearReleased: 1999 };
28// should error here because title: undefined is not assignable to string
29const x: Movie = { ...m, title: undefined };
30
31interface Fields {
32    foo: number;
33    bar: string;
34}
35interface NearlyPartialFields {
36    foo: number | undefined;
37    bar: string | undefined;
38}
39function g(fields: Fields, partialFields: Partial<Fields>, nearlyPartialFields: NearlyPartialFields) {
40    // ok, undefined is stripped from optional properties when spread
41    fields = { ...fields, ...partialFields };
42    // error: not optional, undefined remains
43    fields = { ...fields, ...nearlyPartialFields };
44}
45
46
47//// [objectSpreadStrictNull.js]
48var __assign = (this && this.__assign) || function () {
49    __assign = Object.assign || function(t) {
50        for (var s, i = 1, n = arguments.length; i < n; i++) {
51            s = arguments[i];
52            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
53                t[p] = s[p];
54        }
55        return t;
56    };
57    return __assign.apply(this, arguments);
58};
59function f(definiteBoolean, definiteString, optionalString, optionalNumber, undefinedString, undefinedNumber) {
60    // optional
61    var optionalUnionStops = __assign(__assign(__assign({}, definiteBoolean), definiteString), optionalNumber);
62    var optionalUnionDuplicates = __assign(__assign(__assign(__assign({}, definiteBoolean), definiteString), optionalString), optionalNumber);
63    var allOptional = __assign(__assign({}, optionalString), optionalNumber);
64    // undefined
65    var undefinedUnionStops = __assign(__assign(__assign({}, definiteBoolean), definiteString), undefinedNumber);
66    var undefinedUnionDuplicates = __assign(__assign(__assign(__assign({}, definiteBoolean), definiteString), undefinedString), undefinedNumber);
67    var allUndefined = __assign(__assign({}, undefinedString), undefinedNumber);
68    var undefinedWithOptionalContinues = __assign(__assign(__assign({}, definiteBoolean), undefinedString), optionalNumber);
69}
70var m = { title: "The Matrix", yearReleased: 1999 };
71// should error here because title: undefined is not assignable to string
72var x = __assign(__assign({}, m), { title: undefined });
73function g(fields, partialFields, nearlyPartialFields) {
74    // ok, undefined is stripped from optional properties when spread
75    fields = __assign(__assign({}, fields), partialFields);
76    // error: not optional, undefined remains
77    fields = __assign(__assign({}, fields), nearlyPartialFields);
78}
79