что означает префикс T в именах типов для машинописи - PullRequest
1 голос
/ 16 октября 2019

Кажется, что это обычный шаблон для префикса типов с буквой T.

Вот пример: https://github.com/facebook/flux/blob/2ab02c6e61618da270509dca7a8a40c852570f1b/examples/flux-async/flow/flux-utils.js#L32

Для чего этот шаблон? В чем разница между типом State и типом TState? Почему TState не нужно нигде импортировать или определять, это примитив машинописи?

1 Ответ

2 голосов
/ 21 октября 2019

Это просто соглашение об именах для аргументов типа (он же generics) .

Почему? Аргументы типа - это уникальный вид параметра в коде (он не представляет конкретный тип или значение, скорее это заполнитель для какого-либо типа в этом контексте), поэтому полезно иметь какой-то визуально различимый шаблон именования, длячитабельность кода.

В простых случаях имя T является часто используемым для аргумента типа:

interface Collection<T> {
  [index: number]: T;
}

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

class Component<P, S> {
  // In React `P` represents "Props" type, and `S` represents "State" type
}

Однако, это может быть довольно трудно читать! Хорошо известно, что отдельные буквы, такие как T и S, являются своего рода аргументом типа, а не конкретными типами, но представьте себе код, который ссылается на P, S, R, SS, и вынужно разобраться, что это значит, пока вы читаете код. Это может быть трудно. Поэтому для лучшей читабельности вы можете использовать полное имя (нет синтаксических ограничений на имена аргументов типа):

class Component<Props, State> { }

Это прекрасно работает. Проблема в том, что Props и State выглядят так, как будто они могут быть реальными конкретными типами с именами Props и State, но это не так. Так что теперь у вас есть другой вид потенциальной путаницы. Итак, наконец, чтобы сохранить читабельность без потери намека на то, что они являются аргументами типа заполнителя, а не конкретными типами, используйте полные имена с префиксом T (для «аргумента типа»):

class Component<TProps, TState> { }

Единственный нисходящийстороной этого являются более длинные имена, поэтому вы все еще видите T и такие часто используемые, особенно в тех случаях, когда опытный программист, естественно, будет знать, что это означает, например, Collection<T> довольно ясно, Collection<TElement>не является обязательным, и для разработчика React "реквизиты" и "состояние" - это простое использование React, поэтому Component<P, S> будет хорошо известно. В конце концов, это все равно выбор стиля.

Больше информации, чем вы, возможно, хотели. :)

...