Чем может быть полезен оператор $ Keys ‹T›

Допустим, вы работаете над приложением TODO list. Элемент задачи представлен заголовком, который является строкой, и статусом, который может быть либо выполнено, отменено. или удалено.

Тип перечисления

Наивный и рабочий способ смоделировать это в flowtype - использовать тип Enum для представления статуса задачи.

type Status = ‘done’ | ‘undone’ | ‘deleted’
type Todo = {
 title: string,
 status: Status
}

Это совершенно нормально, и компилятор flowtype не позволит вам сделать такую ​​ошибку.

const todoItem : Todo = {
 title: ‘clean my desk’,
 status: ‘dnoe’ // notice the typo
}

Но есть одна проблема: если в вашем коде вы используете условие для todo.status, flow вам не поможет:

const checkIfDone = (todo: Todo): boolean => {
 return todo.status === ‘dnoe’ // notice the typo
}

Flow не будет жаловаться, потому что условие === допустимо для типов и не вызовет ошибки времени выполнения.

$ Keys ‹T› на помощь

Вместо представления статуса задачи с помощью типа перечисления мы можем использовать $ Keys ‹T›:

const STATUS = {
 done: ‘done’,
 undone: ‘undone’,
 deleted: ‘deleted’
}
type Todo = {
 title: string,
 status: $Keys<typeof STATUS>
}

Хорошо, что поток по-прежнему не позволит вам сделать опечатку при назначении Todo:

const todoItem : Todo = {
 title: ‘clean my desk’,
 status: ‘NOT_VALID_STATUS’ // flow will still warn you :)
}

А теперь лучше, если вы перепишете checkIfDone вот так:

const checkIfDone = (todo: Todo): boolean => {
 return todo.status === STATUS.dnoe; // Flow will complain that the                           key does not exist
}

Вы позволяете компилятору потокового типа обнаруживать больше ошибок / опечаток и т. Д.