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