Стараюсь не повторяться в машинописном тексте

#typescript

Вопрос:

Я ловлю себя на том, что повторяю много кода при написании машинописного текста. Я пытаюсь понять, не упускаю ли я здесь чего-то.

Typescript рекламирует себя за то, что может выводить типизацию. Однако на практике эта функция, похоже, почти сразу же разрушается.

Итак, предположим, что у нас есть что-то вроде:

 const options = {
    foo: 'bar'
}
 

И тогда у нас есть какая-то функция, которая будет использоваться options подобным образом:

 someFn(options)
 

Таким образом, функция будет выглядеть примерно так:

 const someFn = (options: { foo: string }) => {
    console.log(options.foo)
}
 

Это нормально, за исключением случаев, когда предположим options , что объект больше. Я понимаю, что способ состоит в том, чтобы настроить интерфейс:

 interface optionsType {
    foo: 'bar'
    foo1: 'bar1'
    foo2: 'bar2'
    // and many more
}

const options: optionsType = {
    foo: 'bar',
    foo1: 'bar1',
    foo2: 'bar2',
    // and many more
}

const someFn2 = (
    options: optionsType
) => {
    console.log(options.foo)
}

const someFn2 = (
    options: optionsType
) => {
    console.log(options.foo)
}

 

Но это повторяется. Кроме того, options уже напечатан выводом (который с гордостью продает TypeScript). Его не нужно было бы определять, за исключением того, что в этом случае это необходимо для повторного использования функций ввода.

Это единственный способ?

Ответ №1:

Вы можете взять тип из options .

 const options = {
    foo: 'bar'
}

type OptionType = typeof options
 

что то же самое, что писать

 type OptionType = {
    foo: string;
}
 

Затем вы можете сослаться на этот тип в остальной части кода.

Дополнительное примечание: если вам действительно нужно foo: 'bar' , а foo: string не в типе, вы также можете добавить as const в параметры.

 const options = {
    foo: 'bar'
} as const

type OptionType = typeof options
 

что то же самое, что писать

 type OptionType = {
    readonly foo: "bar";
}
 

Ответ №2:

Я оказался в аналогичной ситуации, когда создавать новые объекты было довольно скучно.

Одним из способов справиться с этим может быть создание нового класса, который вы можете экспортировать по всему миру, как это

 // core.models.ts
export class OptionsType = {
  foo: string
  foo1: string
  foo2: string

  constructor(options: OptionsType) {
    this.foo = options.foo || 'bar' // Default value you want
    this.foo1 = options.foo1 || 'bar1'
    this.foo2 = options.foo2 || 'bar2'
  }
}

 

Затем вы сможете вызвать этот объект как тип или как новое значение

 const someFn = (options: OptionsType) => {
    console.log(options.foo)
}

// Or create a new object with default values
const someFn = (options = new OptionsType({})) => {
    console.log(options.foo)
}

// Then you could call it like that
this.someFn({foo: 'bar0'}) // log -> 'bar0'
 

Комментарии:

1. ты все еще вроде как повторяешь fooX: string это каждый раз, не так ли?

2. @Calvintwr Для поколения классов да. Может быть, я не понимаю вашего вопроса. Должен ли я удалить свой ответ ?

3. все в порядке, я думаю, что в этом тоже есть своя ценность. Я на самом деле поддержал его, но я просто хотел уточнить, прежде чем приму другой ответ.