Typescript Caveat 1: Mixing String Literal Key And String Key In Object Literal Type
1 min readOct 4, 2022
because Typescript has no negate type and without it, string
cannot cover key that are not a1
and a2
, string
has to cover all keys.
type A = {[x:string]:1, a1:1, a2:2} // error: Property 'a2' of type '2' is not assignable to 'string' index type '1'.type a = A['something'] // 1
// ^?
type a1 = A['a1'] // 1
// ^?
type a2 = A['a2'] // hmm, we get 2, but it is useless
// ^?const A:A={something:1, a1:1, a2:2} // error: Type '2' is not assignable to type '1'.
so far so good, Typescript error suggestion prevent us from doing it in the wrong way
However there is a case it will by pass the first error, that is using intersection
type B = {[x:string]:1} & { b1:1, b2:2} // no errortype b = B['something']
// ^?
type b1 = B['b1']
// ^?
type b2 = B['b2']
// ^?const B:B={something:1, b1:1, b2:2} // error: Type '2' is not assignable to type '1'.
This I believe is deficiency in error suggestion