簡體   English   中英

嵌套打字稿地圖類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM