Почему машинопись жалуется на вычисленное имя свойства? - PullRequest
0 голосов
/ 23 апреля 2020

Использование машинописной версии 3.7.5. У меня есть эти два простых типа, и я ожидаю, что либо оба они компилируют, либо ни один не делает. Однако машинопись только на второй жалуется. Почему второй тип недействителен, а первый - нет?

// this works
type foo = {
  [key in 'xxx']: number
}

// this does not
type bar = {
  xxx: number
  [key in 'xxx']: number
}

Вот сообщения компилятора:

A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type.ts(1170)
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464)
The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter.ts(2361)

См. Код в действии на игровой площадке .

1 Ответ

0 голосов
/ 23 апреля 2020

Первым определением является сопоставленный тип ( 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'.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...