Typescript Utility Types. Динамическое исключение нескольких полей из типа

export function create<K1>(instance: { new(): K1; } ) {

  const ins = new instance();
  // свойства exclduefields будет создаваться в @classDecorator которым помечен класс
  const fields = excludefields(ins.exclduefields) // например ["map"]
  type Result = Omit<K1, ...fields>;
  return ins as Result;
}

Использование

@classDecorator
class Test {
   map() { return [] }
   
   @decorator
   names: any;

   @decorator2
   fill() {  };

}

const test = create(Test);

По сути я хочу создать новый на основе переданного исключая все ключ которые не помечены декораторами.

Я пробывал использовать Omit но там надо заранее прописывать поля которые хочу исключить Я не не могу знать этого заранее


Ответы (1 шт):

Автор решения: EzioMercer

Вы описываете структуры, что значит "Я не могу знать этого заранее"? Вы точно должны знать, где что должно искалючаться. С декораторами не подскажу, но в целом если знать в каких местах что будет исключено, то можно прописать все такие типы заранее так:

type SomeType = {
    a: string,
    b: string,
    c: string,
    d: string
}

type OmitType1 = {
    a: string,
    b: string
}

type OmitType2 = {
    c: string,
    d: string
}

type OmittedType1 = Omit<SomeType, keyof OmitType1>
type OmittedType2 = Omit<SomeType, keyof OmitType2>

const omitted1: OmittedType1 = {

}

const omitted2: OmittedType1 = {

}

Type '{}' is missing the following properties from type 'OmittedType1': c, d

Type '{}' is missing the following properties from type 'OmittedType2': a, b

→ Ссылка