2017-10-10 69 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"]应该像你想要什么。

希望有帮助;祝你好运!


任何帮助表示赞赏。

我明白你在那里做了什么。