2017-10-10 94 views
1

https://github.com/Microsoft/TypeScript/pull/3622類型交點任何

超類型摺疊:一個& B等效於甲如果B是A的超類型

然而:

type a = string & any; // Resolves to any, not string!? 

這十字路口解決任何。不是'任何'字符串的超類型嗎?所以不應該只是字符串,由於超類型崩潰?我錯過了什麼?

用例這裏是一樣的東西:

type PropertyMap = { 
    prop1: { 
     name: "somename"; 
     required: any; 
    }; 
    prop2: { 
     name: "someothername"; 
     required: never; 
    } 
} 

type RequiredOnly = { 
    [P in keyof PropertyMap]: PropertyMap[P] & PropertyMap[P]["required"] 
} 

// RequiredOnly["prop2"] correctly inferred to be never, but we've 
// lost the type info on prop1, since it is now an any (but should 
// have been narrowed to it's original type). 

任何幫助表示讚賞。

回答

3

在TypeScript中,any是類型系統的逃生艙口。或者也許是一個黑洞,它可以吃掉所有其他類型的黑洞。它被視爲頂級類型(任何值都可以分配給類型爲any的變量)和底部類型(類型爲any的值可以分配給任何類型的變量)。你甚至可以說它是一個超類型stringstring的子類型。這通常是不健全的;如果您使用any,則所有類型都可分配給所有其他類型,但它是退出類型系統並進行編譯器可防止的分配的有效方法。

如果你想要一個不是黑洞的真正頂級類型,請嘗試{}。您已經知道never是真正的底部類型。有關更多有趣的閱讀,請參閱Microsoft/TypeScript#9999

爲您的代碼,請嘗試:

type PropertyMap = { 
    prop1: { 
     name: "somename"; 
     required: {}; // top type 
    }; 
    prop2: { 
     name: "someothername"; 
     required: never; // bottom type 
    } 
} 

type RequiredOnly = { 
    [P in keyof PropertyMap]: PropertyMap[P] & PropertyMap[P]["required"] 
} 

現在RequiredOnly["prop1"]應該像你想要什麼。

希望有幫助;祝你好運!


任何幫助表示讚賞。

我明白你在那裏做了什麼。