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に関連しています。 以前は、文字列リテラルは特定の「リテラルコンテキスト」(型アサーションの後など)でのみリテラル型を持ち、式の正確な型をオブジェクトリテラルプロパティの推定型として使用していました。 現在、文字列リテラルには常にリテラルタイプがあり、代わりに、可変の場所(オブジェクトリテラルプロパティなど)が推測されるときにタイプを_拡張_します。 したがって、この例では、(a)文字列リテラルがすでにリテラル型であるため、および(b)型アサーションの後に式全体の結果を拡張するため、型アサーションは効果がありません。

下位互換性を高めるために、初期化式が型アサーションである場合、推論された型を拡張しないことを検討できます。 結局のところ、そうでなければ型アサーションのポイントは何でしょうか?

@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同意しました。型を明示的に指定せずに拡張したくないことを示すために、構文の_some_形式があると便利です。 ただし、下位互換性の理由から、型アサーションにその意味を持たせる必要があります。

このページは役に立ちましたか?
0 / 5 - 0 評価