`CSS 字体加载 API` Typescript 问题
`CSS Font Lading API` issues with Typescript
在我的 angular
库中,我尝试使用 Font loading Api 为此我创建了一个 declaration
文件,如下所示:( index.d.ts)
// Spec: https://www.w3.org/TR/css-font-loading/
type CSSOMString = string;
type FontFaceLoadStatus = 'unloaded' | 'loading' | 'loaded' | 'error';
type FontFaceSetStatus = 'loading' | 'loaded';
interface FontFace {
family: CSSOMString;
style: CSSOMString;
weight: CSSOMString;
stretch: CSSOMString;
unicodeRange: CSSOMString;
variant: CSSOMString;
featureSettings: CSSOMString;
variationSettings: CSSOMString;
display: CSSOMString;
readonly status: FontFaceLoadStatus;
readonly loaded: Promise<FontFace>;
load(): Promise<FontFace>;
}
interface FontFaceSet {
readonly status: FontFaceSetStatus;
readonly ready: Promise<FontFaceSet>;
check(font: string, text?: string): Boolean;
load(font: string, text?: string): Promise<FontFace[]>;
}
declare global {
interface Document {
fonts: FontFaceSet;
}
}
在我的 index.ts 文件中,我导入并开始使用 api:
/*
* Public API Surface of ibo-shared-lib
*/
/// <reference path = "./index.d.ts"
if ((document as any).fonts.ready) {
const myriadfonts = new FontFace('MyriadPro-Regular', 'url(./src/assets/fonts/MyriadPro-Regular.ttf)');
document.fonts.add(myriadfonts);
}
export * from './src/lib/component/index';
export * from './src/lib/directives/index';
export * from './src/lib/pipes/index';
export * from './src/lib/services/index';
export * from './src/lib/ibo-wrapper/ibo-wrapper.module';
export * from './src/lib/ibo-shared-lib.module';
但是我还是报错如下:
error TS2304: Cannot find name 'FontFace'.
error TS2339: Property 'fonts' does not exist on type 'Document'.
那么正确的处理方法是什么?
截至今天 (v4.3),TypeScript 没有 CSS 字体加载的类型定义。 (编辑:这应该会在下一个版本 v4.4 中改变)
幸运的是,这些定义在 DefinitelyTyped 上可用。您可以使用 npm 在您的项目中安装它们,例如:
npm install --save @types/css-font-loading-module
安装这些类型后,您可以删除 index.d.ts
文件,然后像这样导入类型:
import 'css-font-loading-module'
document.fonts.ready.then(function() {
const myriadfonts = new FontFace('MyriadPro-Regular', 'url(./src/assets/fonts/MyriadPro-Regular.ttf)')
document.fonts.add(myriadfonts)
})
顺便说一句,因为 document.fonts.ready
是一个承诺,你 不能 简单地使用这个:
if (document.fonts.ready) {
...
}
否则,由于 promise 是 truthy,您将始终以 运行 if
语句中的代码结束,这不是您的意图我假设。
在我的 angular
库中,我尝试使用 Font loading Api 为此我创建了一个 declaration
文件,如下所示:( index.d.ts)
// Spec: https://www.w3.org/TR/css-font-loading/
type CSSOMString = string;
type FontFaceLoadStatus = 'unloaded' | 'loading' | 'loaded' | 'error';
type FontFaceSetStatus = 'loading' | 'loaded';
interface FontFace {
family: CSSOMString;
style: CSSOMString;
weight: CSSOMString;
stretch: CSSOMString;
unicodeRange: CSSOMString;
variant: CSSOMString;
featureSettings: CSSOMString;
variationSettings: CSSOMString;
display: CSSOMString;
readonly status: FontFaceLoadStatus;
readonly loaded: Promise<FontFace>;
load(): Promise<FontFace>;
}
interface FontFaceSet {
readonly status: FontFaceSetStatus;
readonly ready: Promise<FontFaceSet>;
check(font: string, text?: string): Boolean;
load(font: string, text?: string): Promise<FontFace[]>;
}
declare global {
interface Document {
fonts: FontFaceSet;
}
}
在我的 index.ts 文件中,我导入并开始使用 api:
/*
* Public API Surface of ibo-shared-lib
*/
/// <reference path = "./index.d.ts"
if ((document as any).fonts.ready) {
const myriadfonts = new FontFace('MyriadPro-Regular', 'url(./src/assets/fonts/MyriadPro-Regular.ttf)');
document.fonts.add(myriadfonts);
}
export * from './src/lib/component/index';
export * from './src/lib/directives/index';
export * from './src/lib/pipes/index';
export * from './src/lib/services/index';
export * from './src/lib/ibo-wrapper/ibo-wrapper.module';
export * from './src/lib/ibo-shared-lib.module';
但是我还是报错如下:
error TS2304: Cannot find name 'FontFace'.
error TS2339: Property 'fonts' does not exist on type 'Document'.
那么正确的处理方法是什么?
截至今天 (v4.3),TypeScript 没有 CSS 字体加载的类型定义。 (编辑:这应该会在下一个版本 v4.4 中改变)
幸运的是,这些定义在 DefinitelyTyped 上可用。您可以使用 npm 在您的项目中安装它们,例如:
npm install --save @types/css-font-loading-module
安装这些类型后,您可以删除 index.d.ts
文件,然后像这样导入类型:
import 'css-font-loading-module'
document.fonts.ready.then(function() {
const myriadfonts = new FontFace('MyriadPro-Regular', 'url(./src/assets/fonts/MyriadPro-Regular.ttf)')
document.fonts.add(myriadfonts)
})
顺便说一句,因为 document.fonts.ready
是一个承诺,你 不能 简单地使用这个:
if (document.fonts.ready) {
...
}
否则,由于 promise 是 truthy,您将始终以 运行 if
语句中的代码结束,这不是您的意图我假设。