为什么Typescript省略/拾取擦除符号

为什么Typescript省略/拾取擦除符号,typescript,symbols,mapped-types,Typescript,Symbols,Mapped Types,首先,我对TS还很陌生,我想为自己的项目做一些工作。 但是当我研究类型映射时。我发现Pick/ommit/Exclude和其他键入指令会删除带有符号键的字段。代码如下: interface T { a: number;[Symbol.iterator](): IterableIterator<number>; } type NoA=Omit<T,'a'>; NoA将是一个空类型。但我在其中表达了一个迭代器 为什么会这样?周围有人走动吗 有关详细信息,我的

首先,我对TS还很陌生,我想为自己的项目做一些工作。 但是当我研究类型映射时。我发现Pick/ommit/Exclude和其他键入指令会删除带有符号键的字段。代码如下:

    interface T { a: number;[Symbol.iterator](): IterableIterator<number>; }
    type NoA=Omit<T,'a'>;
NoA将是一个空类型。但我在其中表达了一个迭代器

为什么会这样?周围有人走动吗

有关详细信息,我的库中的相关代码为:

export type Merg<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
export type MergO<U extends object> 
  = (U extends object ? (k: U) => void : never) extends 
    (k: infer I) => void ? (I extends object ? I : object) : object;

export type Alter<T extends object, U extends object> 
  = Pick<T, Exclude<keyof T, keyof U>> & Pick<U, Extract<keyof T, keyof U>>;

export type Extra<T extends object, U extends object> = Pick<T, Exclude<keyof T, keyof U>>;
export type Common<T extends object, U extends object> = Pick<T, Extract<keyof T, keyof U>>;
export type Extend<T extends object, U extends object> = T & Omit<U, keyof T>;
export type Override<T extends object, U extends object> = Omit<T, keyof U> & U;


export type AlterOver<T extends object, U extends object, X extends object> = Alter<T, Extra<U, X>>;
export type ExtendOver<T extends object, U extends object, X extends object> = Extend<T, Extra<U, X>>;
export type OverrideOver<T extends object, U extends object, X extends object> = Override<T, Extra<U, X>>;

export type AlterLike<T extends object, U extends object, X extends object> = Alter<T, Common<U, X>>;
export type ExtendLike<T extends object, U extends object, X extends object> = Extend<T, Common<U, X>>;
export type OverrideLike<T extends object, U extends object, X extends object> = Override<T, Common<U, X>>;
基于@hackape的解决方案,新的按类型排除可以是:

export type Exclude2<T extends object, U extends object> = 
U extends { [Symbol.iterator]: any } ? Omit<T, keyof U>:
T extends { [Symbol.iterator]: infer IT } ? { [Symbol.iterator]: IT } & Omit<T, keyof U> : Omit<T, keyof U>;

与注释中提到的@jcalz一样,Symbol.iterator被视为众所周知的符号,并从解析的映射类型中排除。目前,typescript可以看到表单符号的任何表达式。无论是什么,都是众所周知的符号

解决方法:

interface T { b: boolean; a: number; [Symbol.iterator](): IterableIterator<number>; }

type Omit2<T, K extends keyof T> = T extends { [Symbol.iterator]: infer U } ? { [Symbol.iterator]: U } & Omit<T, K> : Omit<T, K>
type NoA = Omit2<T, 'a'>;

与注释中提到的@jcalz一样,Symbol.iterator被视为众所周知的符号,并从解析的映射类型中排除。目前,typescript可以看到表单符号的任何表达式。无论是什么,都是众所周知的符号

解决方法:

interface T { b: boolean; a: number; [Symbol.iterator](): IterableIterator<number>; }

type Omit2<T, K extends keyof T> = T extends { [Symbol.iterator]: infer U } ? { [Symbol.iterator]: U } & Omit<T, K> : Omit<T, K>
type NoA = Omit2<T, 'a'>;

这只是众所周知的符号有这个问题。请参阅问题已列为已修复,但仍处于打开状态;修复只是意味着有人打开了一个公关来修复它,这只是众所周知的符号有这个问题。请参阅问题已列为已修复,但仍处于打开状态;那个修复只是意味着有人打开了一个PR来修复它,这是一个很好的解决方法。我想每次你操作一个可能有那个符号键的类型时,如果一直应用它,那将是一件非常头疼的事情,而支持十几个左右的著名符号会让事情变得更糟。我认为OP可能会考虑去给它,这样我们就可以做这种类型的RyType = T扩展{[符号·迭代器]:推断U}?U:从来没有;类型numItr=ItrType。。。同样@hackape did.Exclude2和Extract2也可以类似地完成。但是Pick不能像使用keyof那样工作。很好的解决方法。我想每次你操作一个可能有那个符号键的类型时,如果一直应用它,那将是一件非常头疼的事情,而支持十几个左右的著名符号会让事情变得更糟。我认为OP可能会考虑去给它,这样我们就可以做这种类型的RyType = T扩展{[符号·迭代器]:推断U}?U:从来没有;类型numItr=ItrType。。。同样@hackape did.Exclude2和Extract2也可以类似地完成。但是Pick不能像使用keyof一样工作。