тип для всех индексов класса или подкласса - PullRequest
0 голосов
/ 22 марта 2020

Я использую класс машинописи, содержащий данные и их проверку:

class Person extends ValueWithValidation {
    constructor(name: string, phone: string) {
        super()
        this.name = name
        this.phone = phone
    }

    name: string
    phone: string
}

Базовый класс ValueWithValidation выглядит следующим образом:

class ValueWithValidation {
    constructor() {
        this.isValid = true
        this.validationError = {}
    }

    isValid: boolean
    validationError: any;
}

Свойство validationError должно содержать объект с теми же ключами, что и у дочернего класса Person, то есть

person.validationError = {
    name: 'some string',
    phone: 'some other string',
}

Какой правильный тип для validationError?

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

После реализации ответа cherryblossom я понял, что также возможно сделать следующее:

class ValueWithValidation {
    constructor() {
        this.isValid = true
        this.validationError = {}
    }

    isValid: boolean
    validationError: {[K in Exclude<keyof this, keyof ValueWithValidation>]?: string};
}

Таким образом, я могу опустить переменную типа T.

0 голосов
/ 22 марта 2020

Не знаю, правильно ли это сделать, но это работает:

class ValueWithValidation<T> {
  constructor() {
    this.isValid = true
    this.validationError = {}
  }

  isValid: boolean
  validationError: {[K in Exclude<keyof T, keyof ValueWithValidation<{}>>]?: T[K]}
}

class Person extends ValueWithValidation<Person> {
  constructor(name: string, phone: string) {
    super()
    this.name = name
    this.phone = phone
  }

  name: string
  phone: string
}

Объяснение

{
  [
    K in // type K in
    Exclude<keyof T, keyof ValueWithValidation<{}>> // gets keys of T (e.g. Person) that aren't the keys of ValueWithValidation (isValid, validationError)
  ]?: // optional key
    T[K] // typeof K in T (e.g. Person['name'] (string))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...