Я пытаюсь реализовать универсальный функциональный интерфейс и не могу заставить его работать.
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 3.0.3
Какой тип у вашего apiResult?
@ k0pernikus Я бы создал общее микроприложение, в котором мы могли бы анализировать результат запроса токена api в личном интерфейсе
@ k0pernikus Я не знаю, это для целей моего парсера, фильтровать информацию из запроса и сохранять строку токена, и когда она истечет
Почему бы не создать интерфейс непосредственно для вашего apiResponse?
Поскольку я не знаю, всегда ли информация, полученная с обратной стороны, будет иметь идентичную форму, она может поступать из личной БД, AzureAD, ...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я считаю, что вы можете набирать текст с помощью универсального интерфейса 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 уверен, что я только что это сделал
Итак, вот что я изменил, чтобы он работал
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');
};
В лучшем случае старайтесь избегать использования
any. Я также не понимаю, почему вы используете подсказку типов в своем tokenMapper. Чего ты хочешь добиться?