typescript 类型'Navigator'上不存在属性'share'

wz3gfoph  于 2022-12-14  发布在  TypeScript
关注(0)|答案(9)|浏览(897)

我需要在我的Ionic应用程序中使用WebShareAPI。
下面是Introducing the Web Share API中建议的代码

if (window.navigator && window.navigator.share) {
  window.navigator.share({
    title: 'title',
    text: 'description',
    url: 'https://soch.in//',
  })
    .then(() => console.log('Successful share'))
    .catch((error) => console.log('Error sharing', error));
} else {
  alert('share not supported');
}

但是,Typescript编译失败,并出现以下错误:

[11:31:11]  typescript: src/pages/channel_home/channel_home.ts, line: 89
            Property 'share' does not exist on type 'Navigator'.

这里解释了一个可能的原因DOM lib: add support for navigator.share
然而,我想知道一些变通办法,使WebShareApi工作在我的离子应用程序,特别是在任何Angular 或 typescript 应用程序一般。

xurqigkl

xurqigkl1#

根据这个答案,你可以试着定义一个any类型的变量,并给它赋一个类型导航器的值。这个问题与typeScript类型有关。

let newVariable: any;

newVariable = window.navigator;

if (newVariable && newVariable.share) {
  newVariable.share({
    title: 'title',
    text: 'description',
    url: 'https://soch.in//',
  })
    .then(() => console.log('Successful share'))
    .catch((error) => console.log('Error sharing', error));
} else {
  alert('share not supported');
}

另一个选择是扩展接口Navigator,正如我在上面发布的链接中所建议的那样。

t1rydlwq

t1rydlwq2#

对于任何想找到正确答案的人,只需将以下内容添加到global.d.ts文件中:

type ShareData = {
    title? : string;
    text? : string;
    url? : string;
};

interface Navigator
{
    share? : (data? : ShareData) => Promise<void>;
}

这正确地反映了级别1 API。

f8rj6qna

f8rj6qna3#

navigator声明为any

(window.navigator as any).share
kyxcudwk

kyxcudwk4#

【2020年更新】

这个问题在Typescript的最新版本中得到了修复(我不确定是哪个版本,但我猜是从v4.3-beta版本开始)。
另外,下面共享的示例一旦更新到最新版本将无法工作,因为它与Typescript自己的键入冲突。因此,不要应用这些更改或保持类型与父类型相似:

// global.d.ts
interface Navigator extends Navigator {
  share: (options?: ShareData) => Promise<void>;
}

share属性已从可选状态中删除,根据规范,详细信息implemented in Firefox,Firefox中的更改
我们可以通过Typescript的方式来实现:
首先,我们需要为项目定义自定义类型。因此,我们需要在根目录下定义一个/typings/@types文件夹。

.
└── typings

完成后,您需要更新tsconfig.json文件,将新的自定义类型文件夹指向该文件夹。

{
  "compilerOptions": {
    ...
    "typeRoots": [
      "./node_modules/@types",
      "./typings"
    ]
  },
  "include": [
    ...
    "typings",
    "**/*.ts",
    "**/*.tsx"
  ]
  ...
}

这将允许Typescript在/typings文件夹中查找自定义类型
上述参考:

完成以上操作后,我们需要创建一个全局.d.ts文件,Typescript将在其中查找自定义类型。因此,在您的/typings文件夹中创建一个名为global.d.ts的新文件。

// global.d.ts
interface Navigator extends Navigator {
  share?: (options: any) => Promise<void>;
}
  • 我们要做的是用一些额外的属性来支持,从而覆盖默认的Navigator。*

一旦你声明了上面的接口,Typescript将允许你使用navigator.share,但是你需要把它放在一个条件块中,因为share是可选的属性,它可能存在也可能不存在于浏览器中。

希望这对你有帮助!

q0qdq0h2

q0qdq0h25#

这也是可行的,我们不需要创建newVariable。

if (window.navigator && window.navigator.share) {
  window.navigator['share']({
    title: 'title',
    text: 'description',
    url: 'https://soch.in//',
  })
    .then(() => console.log('Successful share'))
    .catch((error) => console.log('Error sharing', error));
} else {
  alert('share not supported');
}
wqsoz72f

wqsoz72f6#

在我的例子中:在Angular中,在我使用的模块上:

navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia;

和类型脚本显示错误“MozGetUserMedia不是属性”。
我修复使用:

declare const navigator: any;

也许同样的方法也适用于您:

rdrgkggo

rdrgkggo7#

这对我很有效

let newVariable = (window.navigator as any)
if(newVariable.share){
  newVariable.share({
  title: 'title',
  text: 'description',
  url: 'https://soch.in//',
})
  .then(() => console.log('Successful share'))
  .catch((error) => console.log('Error sharing', error));
} else {
  alert('share not supported');
}
qeeaahzv

qeeaahzv8#

如果你继续得到错误,尽管在这个网站上的建议,请确保您的页面是通过https服务器.共享功能是不可用的纯http.下面的摘录为我工作.

const nav: any = window.navigator;
nav.share({ title: "Shared via my https page", url: "relativeLink" })
x4shl7ld

x4shl7ld9#

不要直接使用navigator.share/caches/serial或其他类型,这会导致HTTP连接出错。在直接调用该属性之前,请验证它是否存在。

if ('share' in navigator) {
//Do stuff
} else {
 alert('Share API not supported');
}

相关问题