#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. все в порядке, я думаю, что в этом тоже есть своя ценность. Я на самом деле поддержал его, но я просто хотел уточнить, прежде чем приму другой ответ.