我们在以下界面上工作
interface A {
a: string
b: string
c?: number
d?: number
}
我们有一个类型可以让每个键都在T
optional如果他们的类型是string
and required如果是number
type B<T> = {
[K in keyof T as T[K] extends (number|undefined) ? K : never]-?: T[K]
} & {
[K in keyof T as T[K] extends (string|undefined) ? K : never]+?: T[K]
}
/* The resulting type will be:
type B<A> = {
c: number;
d: number;
} & {
a?: string | undefined;
b?: string | undefined;
}
*/
但是,如果我们更改正在开发的接口,使其仅包含条件中指定的类型之一,{}
, which almost对应于any
将被添加到结果类型中
interface A1 {
a: string
b: string
}
/* The resulting type will be:
type B<A1> = {} & {
a?: string | undefined;
b?: string | undefined;
}
*/
这将允许将许多不需要的类型分配给 B,从而达到目的。例如
const b: B<A1> = "We don't want this to happen." // <-- We need an error here.
Question
如何防止结果类型包含{}
?我想B<A1>
得到以下类型
{
a?: string | undefined;
b?: string | undefined;
}
游乐场链接
我通过删除泛型来简化类型,以便结果类型可见。你可以检查一下here https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgILIN4Chm+XALmQGcwpQBzHPAIyNPJCr2QQH4iQBXAWxumq4AJh2Tc+AgL5YsYAJ4AHFACFkAXkwst2nbt2DkAbQDSyUMgDWEOQHsYafMTQmAusggAPSCCFOAFOL8UMgAPshcPhAwoBBCAJTIbMimnBAAbtAuALSiqK56BXhYksgAZJgGJmYgltZ2DnBOecZunt6+yH4MlKHhkdEgsQlJKWLpmQDUufnFWAD0AFTIAEoQxFwANmA98koEsooq6hUsCJy8QQDcBkLnElDXJeXYLHCi3Uy9EUJRMULXLBo7zIPTC31+g3+swWcxkCBsIFI+CIqg0GGQczmyAAPFkssgAPIWAA0yDAAAtgE4qcgAO7kuBgOkoWlwcCxAB0BkIyAARHBecSDJi6HyaIKDGdkAAGIUsW7IACMsywoEgsEQKFQipOeB5H2YtHoIKYKt2KAAwsd0YVbXbkJVTOYrLZ7NrHGhFfk2hAfP5AtAvv0-sNkshUhkoNlcl6Wvb9E9dbgqs66m6dY1Pd6vL6Ol0TRQgz8BkNEmGI5MYzNpIsVmtNttPub9ubkFa0YmXnrgYxC2Dg5CAbQe6C+sW-o8cDC4QikaL23yACqUpwGkjkmybIRiGxM-iOYjACggOA0DYoMA2ZDKACEvIxWNx+IA6ighAiAORM1ngMkrrkyFgQA