[英]Why doesn't typescript infer actual conditional bound type with nested type argument?
[英]Why doesn't Typescript Infer Type in Switch Statements over Deep/Nested Properties
為什么類型推斷在示例 A 中有效,但在示例 B 中無效? 唯一的區別是字符串類型的 position。 block.type
與block.meta.type
。 A 編譯並推斷類型和 B 結果。
// Example B errors
Property 'a' does not exist on type 'Block'. Property 'a' does not exist on type 'ITwo'.
Property 'b' does not exist on type 'Block'. Property 'b' does not exist on type 'IOne'.
如何在不更改IOne
或ITwo
的數據結構的情況下讓 B 編譯和正確推斷?
示例 A
enum TYPE { ONE = 'one', TWO = 'two'}
interface IOne {
a: string,
type: TYPE.ONE
}
interface ITwo {
b: string,
type: TYPE.TWO
}
type Block = IOne | ITwo
[].map((block:Block) => {
switch (block.type) {
case TYPE.ONE:
block.a
break;
case TYPE.TWO:
block.b
break;
}
});
示例 B
enum TYPE { ONE = 'one', TWO = 'two'}
interface IOne {
a: string,
meta : {
type: TYPE.ONE
}
}
interface ITwo {
b: string,
meta : {
type: TYPE.TWO
}
}
type Block = IOne | ITwo
[].map((block:Block) => {
switch (block.meta.type) {
case TYPE.ONE:
block.a
break;
case TYPE.TWO:
block.b
break;
}
});
在此先感謝,J。
這在 TS repo 中的Nested Tagged Unions 問題下進行了討論和跟蹤。 對您的問題的簡短回答:在問題得到解決之前,您將無法做您想做的事情。
也就是說,您仍然可以通過結合使用類型保護和 generics 來實現這一點。 類型保護將執行運行時檢查嵌套值是否與預期類型匹配,並且 generics 將刪除一些樣板文件,否則需要檢查聯合中的每個類型。
由於我們正在討論的示例非常抽象,因此對於您的實際代碼來說,這可能不是一個實用的解決方案。
假設只有少數類型,擺脫 switch 語句以支持條件返回( “早早返回,經常返回” )是有意義的。 這將使使用類型保護變得微不足道:
enum TYPE { ONE = 'one', TWO = 'two'}
interface IOne {
a: string,
meta : {
type: TYPE.ONE
}
}
interface ITwo {
b: string,
meta : {
type: TYPE.TWO
}
}
type Block = IOne | ITwo;
export const isBlock = <T extends Block>(
b: Block,
metaType: TYPE,
): b is T =>
b.meta.type === metaType;
[].map((block: Block) => {
if (isBlock<IOne>(block, TYPE.ONE)) {
return block.a;
}
return block.b;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.