@@ -170,7 +170,8 @@ function abs(x: JSBI): JSBI {
170170  return  x ; 
171171} 
172172
173- const  BUILTIN_CASTS  =  new  Map < PrimitivePropertyNames ,  ( v : unknown )  =>  string  |  number > ( [ 
173+ type  BuiltinCastFunction  =  ( v : unknown )  =>  string  |  number ; 
174+ const  BUILTIN_CASTS  =  new  Map < PrimitivePropertyNames ,  BuiltinCastFunction > ( [ 
174175  [ 'year' ,  ToIntegerThrowOnInfinity ] , 
175176  [ 'month' ,  ToPositiveInteger ] , 
176177  [ 'monthCode' ,  ToString ] , 
@@ -306,7 +307,7 @@ function ParseTemporalTimeZone(stringIdent: string) {
306307  let  {  ianaName,  offset,  z }  =  ParseTemporalTimeZoneString ( stringIdent ) ; 
307308  if  ( ianaName )  return  ianaName ; 
308309  if  ( z )  return  'UTC' ; 
309-   return  offset ; 
310+   return  offset ;   // if !ianaName && !z then offset must be present 
310311} 
311312
312313function  FormatCalendarAnnotation ( id : string ,  showCalendar : Temporal . ShowCalendarOption [ 'calendarName' ] )  { 
@@ -1068,35 +1069,38 @@ export function LargerOfTwoTemporalUnits<T1 extends Temporal.DateTimeUnit, T2 ex
10681069  return  unit1 ; 
10691070} 
10701071
1071- export  function  ToPartialRecord < B  extends  AnyTemporalLikeType > ( 
1072-   bag : B , 
1073-   fields : readonly  ( keyof  B ) [ ] , 
1074-   callerCast ?: ( value : unknown )  =>  unknown 
1075- )  { 
1076-   if  ( ! IsObject ( bag ) )  return  false ; 
1077-   let  any : B ; 
1072+ export  function  ToPartialRecord < B  extends  AnyTemporalLikeType > ( bagParam : B ,  fieldsParam : ReadonlyArray < keyof  B > )  { 
1073+   // External callers are limited to specific types, but this function's 
1074+   // implementation uses generic property types. The casts below (and at the 
1075+   // end) convert to/from generic records. 
1076+   const  bag  =  bagParam  as  Record < PrimitivePropertyNames  &  keyof  B ,  string  |  number  |  undefined > ; 
1077+   const  fields  =  fieldsParam  as  ReadonlyArray < keyof  B  &  PrimitivePropertyNames > ; 
1078+   let  any  =  false ; 
1079+   let  result  =  { }  as  typeof  bag ; 
10781080  for  ( const  property  of  fields )  { 
10791081    const  value  =  bag [ property ] ; 
10801082    if  ( value  !==  undefined )  { 
1081-       any  =  any  ||  ( { }  as  B ) ; 
1082-       if  ( callerCast  ===  undefined  &&  BUILTIN_CASTS . has ( property  as  PrimitivePropertyNames ) )  { 
1083-         any [ property ]  =  BUILTIN_CASTS . get ( property  as  PrimitivePropertyNames ) ( value )  as  unknown  as  B [ keyof  B ] ; 
1084-       }  else  if  ( callerCast  !==  undefined )  { 
1085-         any [ property ]  =  callerCast ( value )  as  unknown  as  B [ keyof  B ] ; 
1083+       any  =  true ; 
1084+       if  ( BUILTIN_CASTS . has ( property ) )  { 
1085+         result [ property ]  =  ( BUILTIN_CASTS . get ( property )  as  BuiltinCastFunction ) ( value ) ; 
10861086      }  else  { 
1087-         any [ property ]  =  value ; 
1087+         result [ property ]  =  value ; 
10881088      } 
10891089    } 
10901090  } 
1091-   return  any  ? any  : false ; 
1091+   return  any  ? ( result   as   B )  : false ; 
10921092} 
10931093
10941094export  function  PrepareTemporalFields < B  extends  AnyTemporalLikeType > ( 
1095-   bag : B , 
1096-   fields : ReadonlyArray < FieldRecord < B > > 
1097- ) : Required < B >  |  undefined  { 
1098-   if  ( ! IsObject ( bag ) )  return  undefined ; 
1099-   const  result  =  { }  as  B ; 
1095+   bagParam : B , 
1096+   fieldsParam : ReadonlyArray < FieldRecord < B > > 
1097+ ) : Required < B >  { 
1098+   // External callers are limited to specific types, but this function's 
1099+   // implementation uses generic property types. The casts below (and at the 
1100+   // end) convert to/from generic records. 
1101+   const  bag  =  bagParam  as  Record < PrimitivePropertyNames  &  keyof  B ,  string  |  number  |  undefined > ; 
1102+   const  fields  =  fieldsParam  as  ReadonlyArray < FieldRecord < typeof  bag > > ; 
1103+   const  result  =  { }  as  typeof  bag ; 
11001104  let  any  =  false ; 
11011105  for  ( const  fieldRecord  of  fields )  { 
11021106    const  [ property ,  defaultValue ]  =  fieldRecord ; 
@@ -1105,15 +1109,11 @@ export function PrepareTemporalFields<B extends AnyTemporalLikeType>(
11051109      if  ( fieldRecord . length  ===  1 )  { 
11061110        throw  new  TypeError ( `required property '${ property }  ' missing or undefined` ) ; 
11071111      } 
1108-       // TODO: two TS issues here: 
1109-       // 1. `undefined` was stripped from the type of `defaultValue`. Will it 
1110-       //    come back when strictNullChecks is enabled? 
1111-       // 2. Can types be improved to remove the need for the type assertion? 
1112-       value  =  defaultValue  as  unknown  as  typeof  bag [ typeof  property ] ; 
1112+       value  =  defaultValue ; 
11131113    }  else  { 
11141114      any  =  true ; 
11151115      if  ( BUILTIN_CASTS . has ( property  as  PrimitivePropertyNames ) )  { 
1116-         value  =  BUILTIN_CASTS . get ( property  as  PrimitivePropertyNames ) ( value )   as   unknown   as   typeof   bag [ keyof   B ] ; 
1116+         value  =  ( BUILTIN_CASTS . get ( property )  as  BuiltinCastFunction ) ( value ) ; 
11171117      } 
11181118    } 
11191119    result [ property ]  =  value ; 
@@ -1122,12 +1122,12 @@ export function PrepareTemporalFields<B extends AnyTemporalLikeType>(
11221122    throw  new  TypeError ( 'no supported properties found' ) ; 
11231123  } 
11241124  if  ( 
1125-     ( ( result  as  Temporal . PlainDateLike ) [ 'era' ]  ===  undefined )  !== 
1126-     ( ( result  as  Temporal . PlainDateLike ) [ 'eraYear' ]  ===  undefined ) 
1125+     ( ( result  as  {   era :  unknown   } ) [ 'era' ]  ===  undefined )  !== 
1126+     ( ( result  as  {   eraYear :  unknown   } ) [ 'eraYear' ]  ===  undefined ) 
11271127  )  { 
11281128    throw  new  RangeError ( "properties 'era' and 'eraYear' must be provided together" ) ; 
11291129  } 
1130-   return  result  as  Required < B > ; 
1130+   return  result  as  unknown   as   Required < B > ; 
11311131} 
11321132
11331133// field access in the following operations is intentionally alphabetical 
0 commit comments