从条件映射类型中排除“{}”

2024-05-05

我们在以下界面上工作

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


@Aplet123 指向https://github.com/microsoft/TypeScript/issues/42864 https://github.com/microsoft/TypeScript/issues/42864作为问题的根源。一种解决方法(可能还有其他更简单的方法):强制它成为对象类型的助手:

type Obj<T> = { [K in keyof T]: T[K] };

const b: Obj<B<A1>> = "We don't want this to happen." // Error! Good.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从条件映射类型中排除“{}” 的相关文章

随机推荐