Typescript Caveat 1: Mixing String Literal Key And String Key In Object Literal Type

Acid Coder
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'.

playground

This I believe is deficiency in error suggestion

--

--

Acid Coder

Typescript Zombie. Youtube Pikachu On Acid. (Unrelated to programming but by watching it you become a good developer overnight)