Я только начинаю работать над проектом реакции с typescript и спрашиваю себя, что мне делать с обычными файлами классов? должен ли я использовать файлы .ts или .tsx, и тогда я не мог найти причин не использовать файл .tsx все время, даже если он не реагирует на проект! Есть ли какая-либо причина или конкретная ситуация, когда мы не должны использовать файлы .tsx? если нет, почему команда typescript добавляет все новое расширение?
Есть ли недостаток в использовании .tsx вместо .ts все время в typescript?
Ответ 1
Это своего рода соглашение использовать x
в конце, когда ваш JavaScript находится в режиме JSX Harmony
. То есть, когда это действительно:
doSomething(<div>My div</div>);
Тем не менее, расширение вашего файла на самом деле не имеет значения, если ваши препроцессоры знают о вашем решении (browserify или webpack). Я, например, использую .js
для всех моих JavaScript, даже когда они React. То же самое относится и к TypeScript, ts/tsx
.
Ответ 2
Вы можете использовать tsx
вместо ts
с очень небольшой разницей. tsx
, очевидно, позволяет использовать jsx
тегов внутри машинописи, но это вносит некоторые разборе неясностей, которые делают TSX немного отличаются. По моему опыту эти различия не очень большие:
Утверждения типа с <>
не работают, так как это маркер для тега jsx.
Typescript имеет два синтаксиса для утверждений типа. Они оба делают одно и то же, но одно можно использовать в TSX, а другое нет:
let a: any;
let s = a as string // ok in tsx and ts
let s2 = <string>a // only valid in ts
Я хотел бы использовать в as
вместо <>
в TS файлов, а также для обеспечения согласованности. as
было на самом деле введено в Typescript, потому что <>
не был применим в tsx
Общие функции со стрелками без ограничений анализируются неправильно
Функция стрелки ниже в ts
работает нормально, но ошибка в tsx
как <T>
интерпретируется как начало тега в tsx
const fn = <T>(a: T) => a
Вы можете обойти это, добавив ограничение или не используя функцию стрелки:
const fn = <T extends any>(a: T) => a
const fn = <T,>(a: T) => a // this also works but looks weird IMO
const fn = function<T>(a: T) { return a;}
Заметка
Хотя вы можете использовать TSX вместо TS, я бы рекомендовал против этого. Конвенция является сильной вещью, люди ассоциируют tsx
с jsx
и, вероятно, будут удивлены, что вы не имеете никаких jsx
тегов, лучше держать разработчик сюрприза к минимуму.
Хотя приведенные выше неоднозначности (хотя, вероятно, и не полный список) невелики, они, вероятно, сыграли большую роль в решении использовать выделенное расширение файла для нового синтаксиса, чтобы обеспечить обратную совместимость файлов ts
.
Ответ 3
Причина, по которой было введено расширение .jsx, заключается в том, что JSX является расширением синтаксиса JS и, следовательно, файлы .jsx не содержат допустимого JavaScript.
TypeScript следует тому же соглашению, вводя расширения .ts и .tsx. Практическое отличие состоит в том, что .tsx не допускает утверждения типа <Type>
поскольку синтаксис конфликтует с тегами JSX. as Type
Утверждения as Type
были введены в качестве замены для <Type>
и считались предпочтительным выбором по причинам согласованности как в .ts, так и в .tsx. Если код из .ts используется в файле .tsx, <Type>
необходимо исправить.
Использование расширения .tsx подразумевает, что модуль связан с React и использует синтаксис JSX. Если это не так, расширение может дать ложное представление о содержимом модуля и роли в проекте, это аргумент против использования расширения .tsx по умолчанию.
С другой стороны, если файл связан с React и имеет хорошие шансы в какой-то момент содержать JSX, его можно с самого начала именовать как .tsx, чтобы избежать переименования позже.
Например, служебные функции, которые используются вместе с компонентами React, могут включать JSX в любой точке и, таким образом, могут безопасно использовать имена .tsx, в то время как структура кода Redux не предполагает непосредственного использования компонентов React, может использоваться и тестироваться отдельно от React. и может использовать имена .ts.
Ответ 4
Я считаю, что с файлами .tsx вы можете использовать весь код JSX (JavaScript XML). В то время как в файле .ts вы можете использовать только машинопись.
Ответ 5
Файлы .ts
имеют синтаксис утверждения типа <AngleBracket>
который конфликтует с грамматикой JSX. Чтобы не ломать .tsx
людей, мы используем .tsx
для JSX и добавили синтаксис foo as Bar
который разрешен в .ts
и .tsx
.
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
И другой, как-синтаксис:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
Мы можем использовать .ts с as-syntax
но <string>someValue
- это круто!