Имя типа объекта ввода-вывода теряется в WebStorm

#typescript #webstorm

#typescript #webstorm

Вопрос:

Я хотел бы использовать io-ts для проверки ввода. Однако по сравнению с типом интерфейса WebStorm / IDEA не показывает имя типа объекта при наведении курсора мыши на тип, но показывает детали самого типа.

Давайте предположим, что у нас есть следующий код пользователя ввода-вывода и пользователя интерфейса.

 import * as t from 'io-ts';

const UserType = t.type({
    name: t.string,
});

type User = t.TypeOf<typeof UserType>;

interface UserI {
    name: string;
}
const myUserI: UserI = { name: 'Paul' }; //WebStorm Type const myUserI: UserI
const myUserIoTs: User = { name: 'Luna' }; //WebStorm Type const myUserIoTs: { name : string }
 

При наведении курсора мыши на myUserI отображается информация о типе из WebStorm const myUserI: UserI

Интерфейс имени типа объекта

Однако, когда я навожу курсор мыши на тип myUserIoTs, информация, отображаемая в WebStorm, отображается const myUserIoTs: {name: string;} вместо const myUserIoTs:User

Имя типа объекта ввода-вывода

Есть ли способ, которым WebStorm может отображать имя типа User вместо {name: string} ?

Ответ №1:

Всплывающая подсказка, которую вы видите в WebStorm при наведении ctrl курсора мыши на символ в файле TypeScript, показывает информацию о предполагаемом типе из службы компилятора TypeScript. И действительно, существует известная разница в информации, которую сам TypeScript предоставляет для интерфейсов и перечислений по сравнению с псевдонимами типов. Вот проблема с отслеживателем TypeScript: https://github.com/microsoft/TypeScript/issues/25894

Комментарии:

1. Привет, Лена. Большое спасибо за ваш ответ. Когда я прочитал проблему, на которую вы ссылались, я вроде как чувствую, что у них противоположная проблема, что им нужна расширенная информация о типе. Вы уверены, что это связано.

2. да, я уверен. Хотя они действительно хотят видеть расширенную информацию для интерфейсов, как и для псевдонимов типов, это все та же проблема, и так работает tsserver

Ответ №2:

Для этого есть обходной путь, определяющий интерфейс.

 interface User extends t.TypeOf<typeof User> {}