Почему navigator.credentials.create возвращает Credential вместо PublicKeyCredential в TypeScript?

Вопрос или проблема

Я использую typescript 5.6 (“typescript”: “~5.6”)

Когда я пытаюсь использовать WebAuth, я обнаружил, что navigator.credentials.create возвращает Promise<Credential | null>

введите описание изображения здесь
введите описание изображения здесь

Но на MDN я считаю, что это должно быть PublicKeyCredential (хотя он наследуется от Credential)

navigator.credentials.create довольно гибкий и позволяет создавать несколько типов учетных данных, не только PublicKeyCredential, но также FederatedCredential и PasswordCredential. Все это зависит от типа опций, которые вы отправляете с вашим запросом.

Как вы говорите в вопросе, PublicKeyCredential наследуется от Credential, так что PublicKeyCredential всегда является Credential, даже если Credential не всегда может быть PublicKeyCredential. Но если вы отправляете PublicKeyCredentialCreationOption в navigator.credentials.create, вы можете ожидать, что Credential, который вы получите в ответ, будет PublicKeyCredential или NULL.

Смотрите документацию по методу create() для получения дополнительной информации

Ответ или решение

Метод navigator.credentials.create возвращает Promise<Credential | null>, поскольку он является частью более широкой API для работы с разными типами учетных данных, включая PasswordCredential, FederatedCredential и PublicKeyCredential. Хотя PublicKeyCredential наследуется от Credential, это не означает, что метод ограничивается только возвращением PublicKeyCredential.

Основная причина, по которой возвращаемое значение объявляется как Credential, заключается в гибкости navigator.credentials.create. Этот метод может создавать разные типы учетных данных в зависимости от параметров, переданных в запросе. Например, если вы передаете параметры для создания FederatedCredential или PasswordCredential, возвращаемый результат будет являться соответствующим типом учетных данных.

Когда вы передаете PublicKeyCredentialCreationOptions в navigator.credentials.create, ожидается, что возвращаемое значение будет PublicKeyCredential, если процесс создания прошел успешно. Если по какой-то причине создание не удалось, метод вернет null.

Таким образом, определение возвращаемого значения как Credential обеспечивает согласованность с многообразием типов учетных данных, которые могут быть созданы через этот метод. Вы можете использовать оператор instanceof для проверки фактического типа учетных данных, например:

const credential = await navigator.credentials.create({ /* ваши параметры */ });

if (credential instanceof PublicKeyCredential) {
    // Успешно получен PublicKeyCredential
} else {
    // credentials не является PublicKeyCredential, обработайте это
}

Для более подробной информации рекомендуем обратиться к документации, например, к странице MDN по create().

Таким образом, возвращаемый тип Credential служит для обозначения того, что navigator.credentials.create способен вернуть несколько типов учетных данных, и лишь в случае успешного создания PublicKeyCredential вы сможете использовать его как таковой.

Оцените материал
Добавить комментарий

Капча загружается...