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

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

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Acid Coder

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