探索 Tiptap V3 的最新功能

使用 TypeScript

Editor

整个 Tiptap 代码库都是用 TypeScript 编写的。如果你以前没有听说过它或从未使用过,也没关系。你不必使用它。

TypeScript 通过添加类型(因此得名)扩展了 JavaScript。它添加了 Vanilla JavaScript 中不存在的新语法。实际上,这些语法在浏览器运行之前会被移除,但这个步骤——编译——对于早期查找错误非常重要。它会检查你是否将正确类型的数据传递给函数。对于一个大型且复杂的项目而言,这非常有价值。这意味着在将代码交付给你之前,我们会收到很多错误通知。

无论如何,如果你在项目中不使用 TypeScript,这也没关系。 你仍然可以使用 Tiptap,并且仍然可以获得 Tiptap API 的良好自动完成(如果你的编辑器支持它,大多数编辑器都是支持的)。

如果你在项目中使用 TypeScript 并希望扩展 Tiptap,有两种类型是值得了解的。

类型

选项类型

要扩展或创建扩展的默认选项,你需要定义一个自定义类型,以下是一个示例:

import { Extension } from '@tiptap/core'

export interface CustomExtensionOptions {
  awesomeness: number
}

const CustomExtension = Extension.create<CustomExtensionOptions>({
  addOptions() {
    return {
      awesomeness: 100,
    }
  },
})

存储类型

要为你的扩展存储添加类型,你需要将其作为第二个类型参数传递并定义存储类型,以下是一个示例:

import { Extension } from '@tiptap/core'

export interface CustomExtensionStorage {
  awesomeness: number
}

// 这扩展了 Storage 接口,使得 `editor.storage.customExtension` 的类型为 `CustomExtensionStorage`
declare module '@tiptap/core' {
  interface Storage {
    customExtension: CustomExtensionStorage
  }
}

// 这创建了扩展,存储类型作为第二个类型参数传递
// 使得 `this.storage` 的类型为 `CustomExtensionStorage`
const CustomExtension = Extension.create<{}, CustomExtensionStorage>({
  name: 'customExtension',

  addStorage() {
    return {
      awesomeness: 100,
    }
  },
})

现在,在扩展外部使用存储将是类型安全的:

const customStorage = editor.storage.customExtension
customStorage.awesomeness = 200 // ✅

命令类型

核心包还导出了一个 Command 类型,需要添加到你在代码中指定的所有命令中。以下是一个示例:

import { Extension } from '@tiptap/core'

declare module '@tiptap/core' {
  interface Commands<ReturnType> {
    customExtension: {
      /**
       * 注释将被添加到自动完成中。
       */
      yourCommand: (someProp: any) => ReturnType
    }
  }
}

const CustomExtension = Extension.create({
  addCommands() {
    return {
      yourCommand:
        (someProp) =>
        ({ commands }) => {
          // …
        },
    }
  },
})

基本上就是这些。其余的工作我们会自动完成。