Typescript Лучшая практика для перечисления в тип объекта - PullRequest
1 голос
/ 02 августа 2020

Предположим, у нас есть такое перечисление,

enum CustomerType {
   New = 'new',
   Owner = 'self',
   Loyal = 'subscriber'
}

, с помощью которого проще добавлять проверки, такие как

if(customer.type === CustomerType.New)

Что лучше всего, для ввода объекта с перечислением значения в качестве ключей. В этом случае допустим, что у нас есть метод с именем getCustomerType, который будет возвращать

{ 
   new: true,
   self: false,
   subscriber: false
}

. Также обратите внимание, что упрощение этого метода для возврата только истинного ключа может оказаться невозможным из-за дизайна:)

То, что я пробовал до сих пор, выглядит примерно так:

type CustomerConfig = { [key in CustomerType]: boolean }

Теперь допустим, что я хочу получить первый ключ от этого объекта, и это правда, я бы сделал что-то вроде этого.

export const getCustomer = (obj: CustomerConfig): CustomerType => {
    const customerType = Object.keys(obj).find(x => {
        // Object.keys return `string[]` instead of keyof type https://github.com/microsoft/TypeScript/issues/20853
        return obj[x as keyof CustomerConfig]
    })
    return customerType as CustomerType
}

const tempCustomer = getCustomer({
    'new': true,
    'self': false,
    'subscriber': false
})

console.log(tempCustomer === CustomerType.New)  // true
console.log(tempCustomer === CustomerType.Owner) //false

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 02 августа 2020

Я предлагаю вам сделать некоторые улучшения:

  • функция поиска массива может возвращать undefined, если не найдет совпадений, поэтому лучше добавить этот тип и сделать несколько дополнительные проверки
  • как вы говорите, машинописный текст возвращает неправильный тип для Object.keys, поэтому вы можете просто сказать машинописный текст правильного типа на месте
export const getCustomer = (obj: CustomerConfig): CustomerType | undefined => {
  return (Object.keys(obj) as Array<keyof CustomerConfig>)
     .find(x => obj[x])
}

const tempCustomer = getCustomer({
    'new': true,
    'self': false,
    'subscriber': false
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...