потому что Typescript не имеет отрицательного типа, а без него string не может покрывать ключ, который не является a1 и a2, string должен покрывать все ключи.

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

пока все хорошо, предложение об ошибке Typescript не позволяет нам сделать это неправильно

Однако есть случай, когда он пропустит первую ошибку, то есть использует пересечение

type B = {[x:string]:1} & { b1:1, b2:2} // no error
type 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'.

"детская площадка"

Я считаю, что это недостаток предложения об ошибке