Вопрос о Typescript noob о наличии объекта параметра с реквизитом по умолчанию в конструкторе класса - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть класс javascript, который я хочу переписать в TS:

class A {
  constructor({foo = 'foo', bar = 123, baz = true} = {}) {
    this.foo = foo
    this.bar = bar
    this.baz = baz
  }
}

То, что я сейчас написал на TS:

interface AProps {
  foo: string,
  bar: number,
  baz: boolean,
}

class A {
  foo: string
  bar: number
  baz: boolean

  constructor({foo = 'foo', bar = 123, baz = true}: Partial<AProps> = {}) {
    this.foo = foo
    this.bar = bar
    this.baz = baz
  }
}

Как видите, машинопись имеет в 3 раза больше кода, как сделать это более компактным? Как я знаю, почти любое дублирование кода является анти-шаблонным, поэтому должен быть способ сообщить машинописному тексту, что я хочу, чтобы все поля в классе были из этого интерфейса.

1 Ответ

2 голосов
/ 04 апреля 2020

Вам не нужно указывать интерфейс AProps для типа подсказки конструктора, он будет выведен правильно.

class A {
  foo: string
  bar: number
  baz: boolean

  constructor({foo = 'foo', bar = 123, baz = true} = {}) {
    this.foo = foo
    this.bar = bar
    this.baz = baz
  }
}

Конструктор имеет тип:

constructor A({ foo, bar, baz }?: {
    foo?: string | undefined;
    bar?: number | undefined;
    baz?: boolean | undefined;
}): A

const a = new A({x: 1}); не компилируется с сообщением

Argument of type '{ x: number; }' is not assignable to parameter of type '{ foo?: string | undefined; bar?: number | undefined; baz?: boolean | undefined; }'.
  Object literal may only specify known properties, and 'x' does not exist in type '{ foo?: string | undefined; bar?: number | undefined; baz?: boolean | undefined; }'.(2345)

С исходным кодом

конструктор имеет тип:

constructor A({ foo, bar, baz }?: Partial<AProps>): A

const a = new A({x: 1}); не компилируется с сообщением

Argument of type '{ x: number; }' is not assignable to parameter of type 'Partial<AProps>'.
  Object literal may only specify known properties, and 'x' does not exist in type 'Partial<AProps>'.(2345)
...