[英]Nested Typescript Map Type
使用Typescript 3.5.1,我似乎無法獲取要編譯的值的類型。 對於以下內容:
type foo = 'a' | 'b'
const x: Map<foo, {[key: string]: string}> = new Map([
['a', {'ok': 'so'}],
['b', {'nah': 'right'}]
])
tsc barfs up
const x: Map<foo, {
[key: string]: string;
}>
Type 'Map<"a" | "b", { 'ok': string; 'nah'?: undefined; } | { 'nah': string; 'ok'?: undefined; }>' is not assignable to type 'Map<foo, { [key: string]: string; }>'.
Type '{ 'ok': string; 'nah'?: undefined; } | { 'nah': string; 'ok'?: undefined; }' is not assignable to type '{ [key: string]: string; }'.
Type '{ 'ok': string; 'nah'?: undefined; }' is not assignable to type '{ [key: string]: string; }'.
Property ''nah'' is incompatible with index signature.
Type 'undefined' is not assignable to type 'string'.
這是編譯器錯誤,還是我做錯了什么,使Map的值泛型看起來像聯合類型?
我很確定這不是錯誤。 Typescript將右側的類型縮小為{ok: string, nah?: undefined} | {ok?: undefined, nah: string}
{ok: string, nah?: undefined} | {ok?: undefined, nah: string}
,因為您有兩個缺少另一個屬性的對象。 如果訪問“ nah”,則只有“ ok”的那個將返回未定義,反之亦然。
這意味着初始類型{[key: string]: string}
不再有效,因為屬性可以返回字符串(“ so”和“ right”是字符串的子類型)或未定義。
最簡單的方法是使用Map<foo, {[key: string]: string | undefined}>
Map<foo, {[key: string]: string | undefined}>
。
編輯:更正了推斷的類型-感謝jcalz指出了這一點!
TypeScript的類型推斷有時可能會有些混亂。 它從來都不是完美的,TypeScript團隊不得不做出艱難的選擇。 您得到的選擇之一與您的期望不符...
您可以通過顯式指定泛型來獲得類型推斷:
const x = new Map<foo, {[key: string]: string}>([
['a', {'ok': 'so'}],
['b', {'nah': 'right'}]
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.