#typescript #index-signature
Вопрос:
У меня возникли трудности с вводом виджета в Твиттере.
На данный момент это выбрасывает мне кучу ошибок, в том числе:
ESLint: Unsafe call of an any typed value.(@typescript-eslint/no-unsafe-call)
ESLint: Unsafe member access .catch on an any value.(@typescript-eslint/no-unsafe-member-access)
ESLint: Unsafe member access .createTweet on an any value.(@typescript-eslint/no-unsafe-member-access)
ESLint: Unsafe member access .finally on an any value.(@typescript-eslint/no-unsafe-member-access)
ESLint: Unsafe member access .then on an any value.(@typescript-eslint/no-unsafe-member-access)
Я хотел бы исправить это, создав интерфейс для twi, но я не уверен, как это будет выглядеть.
loadTwitterWidget(): void {
this.setLoadingStatus.emit(true);
this.courseContentElementEmbedTweetService
.loadScript()
.pipe(take(1))
.subscribe(
// I want to create an interface for this
(twitter) => {
(this.tweet.nativeElement as HTMLElement).innerHTML = null;
// Errors occur here
twitter['widgets']
.createTweet(this.courseContentElementEmbed.id, this.tweet.nativeElement, {
...this.tweetOptions,
})
.then((r) => {
if (!r) {
this.setErrorStatus.next();
} else {
this.setSuccessStatus.next();
}
})
.catch((error) => this.logger.error(error))
.finally(() => this.setLoadingStatus.emit(false));
},
(error) => this.logger.error(error)
);
}
До сих пор я пробовал следующее:
export interface ICourseContentElementEmbedTweetWidget {
widgets: {
createTweet: unknown
}
[key: string]: string;
}
Но я понял ошибку TS2411: Property 'widgets' of type '{ createTweet: unknown; }' is not assignable to string index type '
.
Ответ №1:
Вы можете предоставить его, как показано ниже, или вы можете перейти к модулям, нажав F12, если используете vscode и выполните поиск createTweet, там вы получите его тип данных.
export interface ICourseContentElementEmbedTweetWidget {
widgets: {
createTweet: any
}
[key: string]: string;
}
Комментарии:
1. Я получаю ошибку
TS2411: Property 'widgets' of type '{ createTweet: any; }' is not assignable to string index type 'string'.
2. Можете ли вы поделиться информацией об ошибке, попробуйте изменить любую на строку
Ответ №2:
Если вы определяете свойства для своего типа, которые отличаются от типа подписи индекса, вы получите сообщение об ошибке.
Причина в том, что вы можете получить доступ widgets
к нему двумя способами:
object.widgets
илиobject["widgets"]
которые являются одинаковыми, но будут иметь разные типы в вашем коде.
Чтобы решить эту проблему, вы можете определить тип подписи индекса как тип объединения типов свойств:
export interface ICourseContentElementEmbedTweetWidget {
widgets: {
createTweet: unknown
}
[key: string]: string | { createTweet: unknown };
}
Это описано в документах TypeScript здесь: https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures
Однако я бы посоветовал этого не делать, потому что теперь вам придется проверять тип или выполнять утверждение типа при каждом обращении к индексатору. Если вы можете, удалите индексатор и укажите только доступные свойства.
Комментарии:
1. Спасибо. Я попробовал это. Но теперь я получаю ошибку
TS2349: This expression is not callable. Type '{}' has no call signatures.
вместе с@typescript-eslint/no-unsafe-call
@typescript-eslint/no-unsafe-member-access
ошибками и. Есть ли что-нибудь вокруг этого?2. @мафусаил , я думаю, ошибка отображается при вызове
createTweet
, верно? Если это так, то это потому, что неизвестный не является типом функции. При доступе к любому тексту, который набран неизвестным, сначала необходимо проверить его тип. Но я бы предложил изменить тип с неизвестного на тип функции с типизированными параметрами. Вы можете посмотреть здесь, чтобы проверить типы параметров: developer.twitter.com/en/docs/twitter-for-websites/…3. @methuselah вы используете этот модуль узла? npmjs.com/package/twitter-widgets