Первым определением является сопоставленный тип ( do c), который связывает key
, поэтому вы можете использовать его в правой части, например:
type foo = {
[key in 'xxx']: key
}
Вы не можете добавить свойства к сопоставленным типам. Например, для
type foo = {
[key in 'xxx']: key
xxx: number
}
TypeScript покажет ошибку об ожидаемом }
в позиции xxx
.
С другой стороны,
type bar = {
xxx: number
[key in 'xxx']: number
}
является литералом обычного типа, в котором [key in 'xxx']: number
является вычисляемым свойством, для которого сохраняются ограничения, упомянутые в первых двух сообщениях об ошибках.
Третье сообщение об ошибке приходит от TypeScript, интерпретирующего in
как уровень регулярного выражения in
. Вы можете увидеть ту же ошибку здесь:
const error = key in 'xxx'
(и если вы наведете курсор мыши на key
во втором примере, вы также увидите ошибку Cannot find name 'key'.
)