使用 any 键入交叉点
Type intersections using any
来自https://github.com/Microsoft/TypeScript/pull/3622:
Supertype collapsing: A & B is equivalent to A if B is a supertype of A.
但是:
type a = string & any; // Resolves to any, not string!?
此交集解析为任意。 'any' 不是字符串的超类型吗?那么,由于超类型崩溃,这个交集不应该只是字符串吗?我错过了什么?
这里的用例是这样的:
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).
感谢任何帮助。
在 TypeScript 中,any
是类型系统的逃生通道。或者可能是一个黑洞吞噬了它接触到的所有其他类型。它既被视为顶部类型(任何值都可以分配给类型 any
的变量)和底部类型(类型 any
的值可以分配给任何类型的变量)。您甚至可以说它既是 string
的超类型,又是 string
的子类型。这通常是不合理的;如果您使用 any
,所有类型都可以分配给所有其他类型,但这是选择退出类型系统并进行编译器会阻止的分配的有用方法。
如果你想要一个不是黑洞的真正的顶层类型,使用unknown
。你已经知道never
才是真正的底型。有关这方面的更多有趣阅读,请参阅 Microsoft/TypeScript#9999.
对于您的代码,请尝试:
type PropertyMap = {
prop1: {
name: "somename";
required: unknown; // top type
};
prop2: {
name: "someothername";
required: never; // bottom type
}
}
type RequiredOnly = {
[P in keyof PropertyMap]: PropertyMap[P] & PropertyMap[P]["required"]
}
现在 RequiredOnly["prop1"]
应该会如您所愿。
希望对您有所帮助;祝你好运!
Any help appreciated.
我看到你在那里做了什么。
来自https://github.com/Microsoft/TypeScript/pull/3622:
Supertype collapsing: A & B is equivalent to A if B is a supertype of A.
但是:
type a = string & any; // Resolves to any, not string!?
此交集解析为任意。 'any' 不是字符串的超类型吗?那么,由于超类型崩溃,这个交集不应该只是字符串吗?我错过了什么?
这里的用例是这样的:
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).
感谢任何帮助。
在 TypeScript 中,any
是类型系统的逃生通道。或者可能是一个黑洞吞噬了它接触到的所有其他类型。它既被视为顶部类型(任何值都可以分配给类型 any
的变量)和底部类型(类型 any
的值可以分配给任何类型的变量)。您甚至可以说它既是 string
的超类型,又是 string
的子类型。这通常是不合理的;如果您使用 any
,所有类型都可以分配给所有其他类型,但这是选择退出类型系统并进行编译器会阻止的分配的有用方法。
如果你想要一个不是黑洞的真正的顶层类型,使用unknown
。你已经知道never
才是真正的底型。有关这方面的更多有趣阅读,请参阅 Microsoft/TypeScript#9999.
对于您的代码,请尝试:
type PropertyMap = {
prop1: {
name: "somename";
required: unknown; // top type
};
prop2: {
name: "someothername";
required: never; // bottom type
}
}
type RequiredOnly = {
[P in keyof PropertyMap]: PropertyMap[P] & PropertyMap[P]["required"]
}
现在 RequiredOnly["prop1"]
应该会如您所愿。
希望对您有所帮助;祝你好运!
Any help appreciated.
我看到你在那里做了什么。