配列スプレッド演算子を使用して新しい配列を作成するときTypeScriptが正しい型情報を失うようです。TypeScript(^ 2.3.3)は配列の広がりに関する型情報を失いますか?
Array.combine()
で新しい配列を作成すると、これは起こりません。
これを実証するための簡単な例を用意しました。宣言のマージを使用して、定数(ACES
、TWOS
など)に対応する型があるようにします。次に、タイプ「Category
」を作成して「スーパータイプ」にします。
変数sectionsSpread
は、アレイスプレッド演算子を使用して変数string[]
を作成した後のものです。変数sectionsCombined
のタイプはCategory[]
です。
変数sectionsSpread
もタイプCategory[]
であると予想しました。
これはバグですか?私は間違って配列が広がっているのですか?
const ACES = 'ACES';
type ACES = typeof ACES;
const TWOS = 'TWOS';
type TWOS = typeof TWOS;
const THREES = 'THREES';
type THREES = typeof THREES;
const FULL_HOUSE = 'FULL_HOUSE';
type FULL_HOUSE = typeof FULL_HOUSE;
const SMALL_STRAIGHT = 'SMALL_STRAIGHT';
type SMALL_STRAIGHT = typeof SMALL_STRAIGHT;
const LARGE_STRAIGHT = 'LARGE_STRAIGHT';
type LARGE_STRAIGHT = typeof LARGE_STRAIGHT;
type Category = ACES | TWOS | THREES |
FULL_HOUSE | SMALL_STRAIGHT | LARGE_STRAIGHT;
const upperSection: Array<Category> = [ACES, TWOS, THREES];
const lowerSection: Array<Category> = [FULL_HOUSE, SMALL_STRAIGHT, LARGE_STRAIGHT];
const sectionsSpread = [
...upperSection,
...lowerSection
];
const sectionsCombined = upperSection.concat(lowerSection);
UDATE
@dbandstraと@basaratは正しい方向に私を指摘しました。 suggested blog postを読んだ後で私は理解していると思う。リテラルタイプの拡大。しかし、これはまだ私のためにこの文脈でtypeof
演算子の動作を説明していません。
は、私は次の例では、私の問題は、より明確に願っています:
const ACES = 'ACES';
type ACES = 'ACES'; // non-widening literal type
const TWOS = 'TWOS';
type TWOS = 'TWOS'; // non-widening literal type
type Category = ACES | TWOS; // are these values or types?
const upperSection: Category[] = [ACES];
const lowerSection: Category[] = [TWOS];
const sectionsSpread = [
...upperSection,
...lowerSection,
]; // is of type Category[]
私は変数sectionsSpread
ではなくタイプstring[]
のされて終わるtypeof
を使用する場合:
const ACES = 'ACES';
type ACES = typeof ACES; // what does typeof do here?
const TWOS = 'TWOS';
type TWOS = typeof TWOS; // what does typeof do here?
type Category = ACES | TWOS; // are these values or types?
const upperSection: Category[] = [ACES];
const lowerSection: Category[] = [TWOS];
const sectionsSpread = [
...upperSection,
...lowerSection,
]; // is of type string[]
行動が(対非拡大リテラルを広げる)ここで説明されていますhttps://blog.mariusschulz.com/2017/02/ 04/typescript-2-1-literal-type-widening配列リテラルを修正するには、例えば次のように定義します。 'const ACES = 'ACES'を 'ACES';またはそのようなものに変更して元のconstを '拡大しない'ようにします。 – dbandstra
タイトルが緩んでいるか、失っていると思われますか? – Zze
@Zzeあなたが正しいです。それはタイプです。明らかにそれは_lose_だったはずです。 – Partyschaum