Web OTP API Typescript Typings 问题 - TypeScript 中缺少类型

Posted

技术标签:

【中文标题】Web OTP API Typescript Typings 问题 - TypeScript 中缺少类型【英文标题】:Web OTP API Typescript Typings issue - Missing Types in TypeScript 【发布时间】:2020-08-08 04:28:31 【问题描述】:

我正在按照https://web.dev/web-otp/ 上的说明在我的 Angular 应用程序中实现 Web OTP API。但是当添加下面的代码时,它会抛出错误:

const content = await window.navigator['credentials'].get(
        otp:  transport: ['sms'] ,
        signal: abortController.signal
      );

这是错误信息:

Error   TS2769  (TS) No overload matches this call.
  Overload 1 of 2, '(options?: CredentialRequestOptions): Promise<CredentialType>', gave the following error.
    Argument of type ' otp:  transport: string[]; ; signal: AbortSignal; ' is not assignable to parameter of type 'CredentialRequestOptions'.
      Object literal may only specify known properties, and 'otp' does not exist in type 'CredentialRequestOptions'.
  Overload 2 of 2, '(options?: CredentialRequestOptions): Promise<Credential>', gave the following error.
    Argument of type ' otp:  transport: string[]; ; signal: AbortSignal; ' is not assignable to parameter of type 'CredentialRequestOptions'.
      Object literal may only specify known properties, and 'otp' does not exist in type 'CredentialRequestOptions'.

我添加了@types/webappsec-credential-management,但我相信它尚未更新以支持otp

有什么解决办法吗?

【问题讨论】:

【参考方案1】:

这就是我解决问题的方法:

创建了一个名为 typings 的新文件夹并将其添加到 tsconfig.json 中的 typeRoots

"typeRoots": [
      "typings",
      "node_modules/@types"
    ],

在文件夹typings 中创建了一个新文件polyfills.d.ts,并将以下内容添加到文件中:

interface CredentialRequestOptions 
  otp: OTPOptions;


interface OTPOptions 
  transport: string[];

如果你想知道为什么我没有在界面中添加其他属性,那是因为我已经有了:

"types": [
      "@types/webappsec-credential-management"
    ]

"@types/webappsec-credential-management": "^0.5.1", 中的packages.json

尚未添加对OTP 的支持,为了解决缺少的otp 属性,我利用了TypeScript 的功能Declaration Merging,现在TypeScript 编译器合并了这两个单独的声明(一个在node_modules/@typestypings) 中的其他同名声明到单个定义中。

进一步阅读:https://justintimecoder.com/how-to-polyfil-missing-types-in-typescript/

更新

以下是您可以添加到 Angular 组件以使其在您的应用中工作的功能:

async otpRequest() 
    if ('OTPCredential' in window) 

      const abortController = new AbortController();
      let timer = setTimeout(() => 
        abortController.abort();
      , 10 * 1000);

      let o: CredentialRequestOptions = 
        otp:  transport: ['sms'] ,
        signal: abortController.signal
      ;

      const content = await window.navigator['credentials'].get(o);

      //do what ever you want to do with the received code, probably send it to server
    
  

调用此函数,然后在用户的移动设备上发出http请求发送短信代码。

【讨论】:

以上是关于Web OTP API Typescript Typings 问题 - TypeScript 中缺少类型的主要内容,如果未能解决你的问题,请参考以下文章

从 Typescript POST 到 Web API API,无法传递 JSON 对象

使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证

如何为 dotnet core(web Api) 代码更改以及 TypeScript 代码更改启用实时重新加载

使用 SMS Retriever API Android 的 OTP/SMS 自动获取问题

SpringBoot构建电商基础秒杀项目总结

Web OTP 中是不是支持传输“电子邮件”?