Typescript: 字符串文字的类型断言停止工作

创建于 2016-09-12  ·  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 :

Bug Fixed

最有用的评论

@wallverb同意,最好使用_some_语法形式来指示您不需要显式声明类型就不需要扩展。 但是无论如何,出于向后兼容的原因,我们应该允许类型断言具有这种含义。

所有3条评论

是的,这与#10676有关。 以前,字符串文字只能在某些“文字上下文”中(例如在类型断言之后)才具有文字类型,而我们仅使用表达式的确切类型作为对象文字属性的推断类型。 现在,字符串文字始终具有文字类型,而在推断出可变位置(例如对象文字属性)时,我们将_widen_类型。 因此,在您的示例中,类型声明无效(a)因为字符串文字已经是文字类型,并且(b)因为我们在类型声明之后加宽了整个表达式的结果。

为了更好地向后兼容,我们可以考虑在初始化器表达式是类型断言时_not_扩展推断的类型。 毕竟,否则类型断言的意义是什么?

@ahejlsberg谢谢您的答复。

如果您在初始化器表达式是类型断言的情况下考虑_not_扩展推断的类型,那就太好了,并且同意-这就是类型断言的要点:)

没有它就会停止工作的另一个常见情况是:

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同意,最好使用_some_语法形式来指示您不需要显式声明类型就不需要扩展。 但是无论如何,出于向后兼容的原因,我们应该允许类型断言具有这种含义。

此页面是否有帮助?
0 / 5 - 0 等级