使用任何

时间:2017-10-10 18:30:17

标签: typescript intersection any inference

来自https://github.com/Microsoft/TypeScript/pull/3622

  

超级型崩溃:A&如果B是A的超类型,则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).

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:3)

在TypeScript中,any是类型系统的逃逸舱口。或者也许是一个黑洞,它会触及所有其他类型的黑洞。它被视为顶部类型(任何值都可以分配给类型any的变量),底部类型(类型any的值可以分配给任何类型的变量)。您甚至可以说它既是string 的超类型,也是 string的子类型。这通常是不健全的;如果您使用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"]应该像你想要的那样。

希望有所帮助;祝你好运!


任何帮助表示感谢。

我看到你在那里做了什么。