how to remove properties via mapped type in TypeScript

前端 未结 2 1031
有刺的猬
有刺的猬 2020-12-09 04:48

Here is the code

class A {
    x = 0;
    y = 0;
    visible = false;
    render() {

    }
}

type RemoveProperties = {
    readonly [P in keyof T         


        
相关标签:
2条回答
  • 2020-12-09 04:58

    You can use the same trick as the Omit type uses:

    // We take the keys of P and if T[P] is a Function we type P as P (the string literal type for the key), otherwise we type it as never. 
    // Then we index by keyof T, never will be removed from the union of types, leaving just the property keys that were not typed as never
    type JustMethodKeys<T> = ({[P in keyof T]: T[P] extends Function ? P : never })[keyof T];  
    type JustMethods<T> = Pick<T, JustMethodKeys<T>>; 
    
    0 讨论(0)
  • 2020-12-09 05:22

    TS 4.1

    You can now use as clauses in mapped types to filter out properties in one go:

    type Methods<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] };
    type A_Methods = Methods<A>;  // { render: () => void; }
    

    When the type specified in an as clause resolves to never, no property is generated for that key. Thus, an as clause can be used as a filter[.]

    Further info: Announcing TypeScript 4.1 Beta

    Playground

    0 讨论(0)
提交回复
热议问题