Typescript Не удается реализовать интерфейс универсальной функции

Я пытаюсь реализовать универсальный функциональный интерфейс и не могу заставить его работать.

IToken.ts

export interface IToken {
  token: string;
  expires: number;
}

ITokenMapper.ts

export interface ITokenMapper {
  <T>(apiResult: any): T;
}

tokenMapper.ts

import {ITokenMapper} from "./interfaces/ITokenMapper";
import {IToken} from "./interfaces/IToken";

export const tokenMapper: ITokenMapper = function <IToken>(apiResult: any): IToken {
  if (apiResult.token && apiResult.expires) {
    return {token: apiResult.token as string, expires: apiResult.expires as number}
  }
  throw new Error('Unable to parse token');
};

Вот скриншот с tokenMapper.ts, где говорится, что импорт IToken не используется, но мне нужно его использовать:

Typescript Не удается реализовать интерфейс универсальной функции

Обновлено: Использование Typescript 3.0.3

В лучшем случае старайтесь избегать использования any . Я также не понимаю, почему вы используете подсказку типов в своем tokenMapper. Чего ты хочешь добиться?

k0pernikus 19.09.2018 15:26

Какой тип у вашего apiResult?

k0pernikus 19.09.2018 15:28

@ k0pernikus Я бы создал общее микроприложение, в котором мы могли бы анализировать результат запроса токена api в личном интерфейсе

AdMer 19.09.2018 15:30

@ k0pernikus Я не знаю, это для целей моего парсера, фильтровать информацию из запроса и сохранять строку токена, и когда она истечет

AdMer 19.09.2018 15:31

Почему бы не создать интерфейс непосредственно для вашего apiResponse?

k0pernikus 19.09.2018 15:32

Поскольку я не знаю, всегда ли информация, полученная с обратной стороны, будет иметь идентичную форму, она может поступать из личной БД, AzureAD, ...

AdMer 19.09.2018 15:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
995
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что вы можете набирать текст с помощью универсального интерфейса ITokenMapper<T>.

interface IToken {
    token: string;
    expires: number;
}

interface ITokenMapper<T> {
    (apiResult: T): T;
}

const tokenMapper: ITokenMapper<IToken> = function (apiResult) {
    if (apiResult.token && apiResult.expires) {
      return { token: apiResult.token as string, expires: apiResult.expires as number};
    }

    throw new Error('Unable to parse token');
};

От: https://www.typescriptlang.org/docs/handbook/generics.html#generic-types

@AdMer Пожалуйста, укажите в комментарии или в качестве собственного ответа, что вы изменили, чтобы теперь это соответствовало вашему варианту использования, чтобы другие пользователи с аналогичной проблемой также могли извлечь из этого пользу.

k0pernikus 19.09.2018 18:30

@ k0pernikus уверен, что я только что это сделал

AdMer 20.09.2018 09:43

Итак, вот что я изменил, чтобы он работал

ITokenMapper.ts -> IMapper.ts переименован и обновлен

export type IMapper<T> = (apiResult: any) => T;

tokenMapper.ts -> abpTokenMapper.ts переименован и обновлен

import { IMapper } from "../../utils/IMapper";
import { IToken } from "../interfaces/IToken";

export const abpTokenMapper: IMapper<IToken> = (apiResult: any) => {
  if (apiResult.accessToken && apiResult.expireInSeconds) {
    return { token: apiResult.accessToken as string, expires: apiResult.expireInSeconds as number }
  }
  throw new Error('Unable to parse token');
};

Другие вопросы по теме