Typescript: Утверждение типа для строковых литералов перестало работать

Созданный на 12 сент. 2016  ·  3Комментарии  ·  Источник: microsoft/TypeScript

Версия TypeScript: 2.1.0-dev.20160912

Код

// A *self-contained* demonstration of the problem follows...
const types = {
    test: <'test'>'test',
    test2: 'test2' as 'test2'
} // type: {test: string, test2:string}

let a = <'test'>'test'  // type string

Вероятно, связано с: https://github.com/Microsoft/TypeScript/pull/10676

Bug Fixed

Самый полезный комментарий

@wallverb Согласен, было бы неплохо иметь некоторую форму синтаксиса, чтобы указать, что вы не хотите расширения, без необходимости явно указывать тип. Но, тем не менее, по причинам обратной совместимости мы должны позволить утверждениям типа иметь это значение.

Все 3 Комментарий

Да, это связано с номером 10676. Раньше строковый литерал имел литеральный тип только в определенных «литеральных контекстах» (например, после утверждения типа), и мы просто использовали бы точный тип выражения в качестве предполагаемого типа свойства литерала объекта. Теперь строковые литералы всегда имеют литеральные типы, и вместо этого мы _widen_ типы, когда они выведены для изменяемых местоположений (например, свойств литералов объекта). Итак, в вашем примере утверждения типа не имеют эффекта (а), потому что строковые литералы уже имеют литеральные типы, и (б) потому, что мы расширяем результат всего выражения после утверждения типа.

Для лучшей обратной совместимости мы могли бы рассмотреть _не_ расширение предполагаемого типа, когда выражение инициализатора является утверждением типа. В конце концов, какой в ​​противном случае был бы смысл утверждения типа?

@ahejlsberg Спасибо за ответ.

Было бы замечательно, если бы вы могли рассмотреть _не_ расширение предполагаемого типа, когда выражение инициализатора является утверждением типа - и согласитесь - это своего рода суть утверждения типа :)

Еще один распространенный случай, когда он перестанет работать без него:

function test(style: { align: 'left' | 'right', size: number }) {
}

const style = {
    align: 'left' as 'left',
    size: 5
}

test(style)

Синтаксис для буквальных типов https://github.com/Microsoft/TypeScript/issues/10195 поможет, но я не уверен, что когда-нибудь это станет реальностью.

Большое спасибо за все

@wallverb Согласен, было бы неплохо иметь некоторую форму синтаксиса, чтобы указать, что вы не хотите расширения, без необходимости явно указывать тип. Но, тем не менее, по причинам обратной совместимости мы должны позволить утверждениям типа иметь это значение.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги