2017-12-27 324 views
1

考慮下面的代碼片段:Array.prototype.filter和歧視聯盟的最小類型註釋?

type asdf = '.' | number; 
const foo: asdf[] = ['.', 1, 3, '.']; 
const bar: number[] = foo.filter(v => typeof v === 'number'); 

它無法編譯,因爲編譯器無法推斷出的bar類型是number[]

  1. 爲什麼編譯器不能推導出正確的類型?
  2. 什麼是使編譯器理解類型的最小類型註釋?

回答

1

您需要使用type guard來實現此目的。

一個類型後衛是一個函數,它接收一個項目v並聲明它是類型Foo。在你的榜樣,你的類型後衛看起來就像這樣:

function isNumber(value: asdf): value is number { 
    return typeof value === "number"; 
} 

然後,您將通過該值到您的filter功能,像這樣:

const bar: number[] = foo.filter(isNumber); 

如果你想保持你的函數內聯,你可以做這樣的(但我認爲這是一個有點不太清楚):

const bar: number[] = foo.filter((item): item is number => typeof item === "number"); 

你的代碼是行不通的,因爲你沒有足夠的item is number一部分 - 告訴合作mpiler,如果斷言(typeof item === "number")返回true,則item的類型爲number

+0

內聯版本**完全**是我希望的解決方案。非常感謝! – LudvigH