Извлечение строковых литеральных значений из типа объединения для более строгой проверки типов - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующие типы:

interface Employee {
    employeeType: string
}

interface Manager extends Employee   { employeeType: 'MANAGER'   // .. etc }

interface Developer extends Employee { employeeType: 'DEVELOPER' // .. etc }

type Staff = Developer | Manager

Я хочу создать новый тип Dynami c, который содержит все возможные строковые литералы для Staff > employeeType, так что если новый тип Employee добавленный к Staff union, их employeeType добавляется к этому новому типу.

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

type EmployeeType = 'DEVELOPER' | 'MANAGER'

Я бы хотелось бы иметь возможность добавлять новый тип интерфейса Employee и обновлять объединение Staff, а EmployeeType динамически включать новый тип, например -

...
interface Designer extends Employee { employeeType: 'DESIGNER' // ..etc }

type Staff = Developer | Manager | Designer

// ... now EmployeeType contains 'DEVELOPER' | 'MANAGER' | 'DESIGNER'

Преимущество здесь в том, что возможность принудительной проверки типа при выполнении чего-то подобного:

function createEmployee(employeeType: EmployeeType, attributes: ...) {
   // ...
}

В отличие от использования employeeType: string в качестве ввода.

Есть ли способ выполнить sh это в Typecript? Вот соответствующая Typescript Playground :)


Несколько связанный вопрос (хотя и с использованием Enum с): { ссылка }

1 Ответ

1 голос
/ 14 января 2020

Вы можете просто искать employeeType свойство, так как оно является общим свойством Staff:

type EmployeeType = Staff["employeeType"] // "DEVELOPER" | "MANAGER" | "DESIGNER"

createEmployee('MANAGER') // works
createEmployee('SALES')   // error

Образец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...