Чем может быть полезен оператор $ 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 }
Вы позволяете компилятору потокового типа обнаруживать больше ошибок / опечаток и т. Д.