2017-06-07 4 views
1

配列スプレッド演算子を使用して新しい配列を作成するときTypeScriptが正しい型情報を失うようです。TypeScript(^ 2.3.3)は配列の広がりに関する型情報を失いますか?

Array.combine()で新しい配列を作成すると、これは起こりません。

これを実証するための簡単な例を用意しました。宣言のマージを使用して、定数(ACESTWOSなど)に対応する型があるようにします。次に、タイプ「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[] 
+0

行動が(対非拡大リテラルを広げる)ここで説明されていますhttps://blog.mariusschulz.com/2017/02/ 04/typescript-2-1-literal-type-widening配列リテラルを修正するには、例えば次のように定義します。 'const ACES = 'ACES'を 'ACES';またはそのようなものに変更して元のconstを '拡大しない'ようにします。 – dbandstra

+0

タイトルが緩んでいるか、失っていると思われますか? – Zze

+1

@Zzeあなたが正しいです。それはタイプです。明らかにそれは_lose_だったはずです。 – Partyschaum

答えて

2

これが拡大している対非 - 広がる。明示的なアノテーションは、TypeScriptは他の値に代入するときにその意味を変更しないことを意味します。

拡幅:

const ACES = 'ACES'; 
type Category = typeof ACES; 

const upperSection: Category[] = []; 

const sectionsSpread = [ 
    ...upperSection, 
]; // string[] 

非拡大:

const ACES = 'ACES'; 
type Category = 'ACES'; 

const upperSection: Category[] = []; 

const sectionsSpread = [ 
    ...upperSection, 
]; // Category 
関連する問題