对于 TypeScript 4.4 及更高版本
TypeScript 4.4更新了标准定义库,缺少接口和方法(完整的更改列表),所以一切都应该开箱即用。以下示例代码现在无需额外的接口/声明合并即可编译:
declare const image: ClipboardItemData;
(async () => {
const item = new ClipboardItem({ "image/png": image });
const files = await navigator.clipboard.read();
if( files.length ) return;
await navigator.clipboard.write([item]);
})();
操场
对于 TypeScript 4.3 及更低版本
截至 2021 年,TypeScript 标准库仍然缺少剪贴板 API 的定义(这就是“找不到名称 'ClipboardItem'”错误的原因)。源存储库上有一个未解决的问题,并且 DOM lib 生成器存储库上有一个拉取请求(因为标准库是自动生成的),应该可以解决这个问题。
同时,您可以添加以下与标准库定义其他全局接口的方式相匹配的定义(不要忘记/// <reference types="../../index" />
在导入文件的顶部添加三斜杠指令):
interface ClipboardItem {
readonly types: string[];
readonly presentationStyle: "unspecified" | "inline" | "attachment";
getType(): Promise<Blob>;
}
interface ClipboardItemData {
[mimeType: string]: Blob | string | Promise<Blob | string>;
}
declare var ClipboardItem: {
prototype: ClipboardItem;
new (itemData: ClipboardItemData): ClipboardItem;
};
请注意,ClipboardItemData
定义为采用Blob
,string
或返回前者之一的承诺,而不仅仅是 a Blob
(参见MDN 参考,例如)。Clipboard
用缺少的read
和write
方法来增加接口也没有什么坏处:
interface Clipboard {
read(): Promise<DataTransfer>;
write(data: ClipboardItem[]): Promise<void>;
}
最后,让我们测试一下定义是否按预期工作:
declare const image: Blob;
(async () => {
const item = new ClipboardItem({ ["image/png"]: image });
const { files } = await navigator.clipboard.read();
if( files.length ) return;
await navigator.clipboard.write([item]);
})();
操场