2017-05-25 79 views
3
let a : any; 
let m = new Map<any, any>(Object.keys(a).map(prop => ([prop.x, prop.y]))); 

esnext目標產生錯誤打字稿錯誤編譯地圖

文件: '文件:///c%3A/GIT/MainLine/members/src/tasks/list/decTest2.ts' 嚴重程度:'錯誤' 消息:'類型'any [] []'的參數不可分配給類型爲'Iterable < [any,any]>'的參數。 屬性類型'[Symbol.iterator]'不兼容。 類型'()=> IterableIterator'不可分配給類型'()=>迭代器< [any,any]>'。 類型'IterableIterator'不可分配爲鍵入'Iterator < [any,any]>'。 屬性'next'的類型不兼容。 類型'(value ?: any)=> IteratorResult'不可分配給類型'(value ?: any)=> IteratorResult < [any,any]>'。 類型'IteratorResult'不可分配爲鍵入'IteratorResult < [any,any]>'。 類型'any []'不可分配爲鍵入'[any,any]'。 類型'any []'中缺少屬性'0'。' 在: '4,27' 源: 'TS'

這很奇怪,因爲

let m2 = new Map<any, any>([[1, 2], [2, 3], ['a', 'b']])

編譯罰款。我需要添加到第一個樣本才能編譯它?

注意,我知道

let m2 = new Map<any, any>(<any>[[1, 2], [2, 3], ["a", 'b']])

也將修復它,但我想明白爲什麼這樣的錯誤了,看看是否有一個更體面的修復。

+0

prop是一個字符串。你確定你不是要寫一個[prop] .x而不是prop.x? – Sebastian

回答

1

問題是,TypeScript不知道你的數組是否意圖在該上下文中成爲一個元組或數組。類型參數推斷嘗試僅將其參數用作推理網站。

結果,稱map時,它不會從new Map<any, any>(...)參數的類型得出的推斷)到map返回類型。

TypeScript 2.4正在製作some changes在這個方向,和your specific scenario was brought up。在這個問題上的討論和進展本身可以是tracked here

作爲一種變通方法,你可以寫一個明確的返回類型

(prop): [any, any] => [prop.x, prop.y] 

,或者你可以給map一個明確的類型參數

Object.keys(a).map<[any, any]>(...) 

注意,在這兩種情況下,打字稿捕捉錯誤xy不是string s上的有效屬性。

+0

加1 - 謝謝!我會稍微打開一下,但這些鏈接特別有用。 –

1

從它,如果你將它設置明確的編譯器根本無法推斷出預期的類型map<U>外觀上來看,它的罰款:

let a: any; 
let b = Object.keys(a).map<[any, any]>(key => [key, a[key]]);  
let m = new Map<any, any>(b); 

的問題是,它放棄並返回any[][]這是無效的預期的類型元組:[any, any][]

+0

哦整齊 - 我不知道Array.prototype.map可以採用泛型類型參數 –

1

這裏的關鍵是你的map回調函數返回的類型。

prop => [prop.x, prop.y] 

打字稿不會自動從數組常量像你返回—它會代之以假定一個普通的數組類型,這意味着你要map調用將返回數組(在這種情況下,any[])推斷的元組類型類型的數組(在這種情況下爲any[][])。但是,對象構造函數Map期望具有特定元組類型的數組。在這種情況下,它將尋找一個數組或[any, any](我們將簡稱爲[any, any][])。

由於TypeScript不會自動推斷您在map中創建的數組中的元組類型,因此滿足類型檢測器的最快方法是指定函數的返回值以表明您打算將它用作一個元組:

(prop): [any, any] => [prop.x, prop.y] 

隨着回調的返回值的類型被明確設置,map將返回[any, any][]類型的值滿足Map構造。

+0

加1 - 感謝噸。我會留下帖子打開一下,但可靠的信息 - 謝謝! –