improve types
This commit is contained in:
@@ -795,17 +795,11 @@ type Bla = {
|
|||||||
options: any
|
options: any
|
||||||
}
|
}
|
||||||
|
|
||||||
type TypeName = "name" | "schema";
|
interface ExtensionExtends {
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
type ObjectType<T> =
|
class ExtensionTest<Options, Extends extends ExtensionExtends> {
|
||||||
T extends "name" ? string :
|
|
||||||
T extends "schema" ? (bla: Bla) => NodeSpec :
|
|
||||||
never;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ExtensionTest<Options> {
|
|
||||||
type = 'extension'
|
type = 'extension'
|
||||||
configs: any = {}
|
configs: any = {}
|
||||||
options: Partial<Options> = {}
|
options: Partial<Options> = {}
|
||||||
@@ -828,12 +822,12 @@ class ExtensionTest<Options> {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
public name(value: string) {
|
public name(value: Extends['name']) {
|
||||||
this.storeConfig('name', value, 'overwrite')
|
this.storeConfig('name', value, 'overwrite')
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
public extend<T extends TypeName>(key: T, value: ObjectType<T>) {
|
public extend<T extends Extract<keyof Extends, string>>(key: T, value: Extends[T]) {
|
||||||
this.storeConfig(key, value, 'extend')
|
this.storeConfig(key, value, 'extend')
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
@@ -841,17 +835,21 @@ class ExtensionTest<Options> {
|
|||||||
create(options?: Partial<Options>) {
|
create(options?: Partial<Options>) {
|
||||||
const self = this
|
const self = this
|
||||||
|
|
||||||
return function<Options2 = Options>(options2?: Partial<Options>): ExtensionTest<Options2> {
|
return function<Options2 = Options>(options2?: Partial<Options>): ExtensionTest<Options2, Extends> {
|
||||||
return cloneInstance(self as unknown as ExtensionTest<Options2>)
|
return cloneInstance(self as unknown as ExtensionTest<Options2, Extends>)
|
||||||
.storeOptions({...options, ...options2} as Options2)
|
.storeOptions({...options, ...options2} as Options2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NodeTest<Options> extends ExtensionTest<Options> {
|
interface NodeExtends extends ExtensionExtends {
|
||||||
|
schema: (bla: Bla) => NodeSpec
|
||||||
|
}
|
||||||
|
|
||||||
|
class NodeTest<Options> extends ExtensionTest<Options, NodeExtends> {
|
||||||
type = 'node'
|
type = 'node'
|
||||||
|
|
||||||
public schema(value: (bla: Bla) => NodeSpec) {
|
public schema(value: NodeExtends['schema']) {
|
||||||
this.storeConfig('schema', value, 'overwrite')
|
this.storeConfig('schema', value, 'overwrite')
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
@@ -866,6 +864,9 @@ const Suggestion = new NodeTest<TestOptions>()
|
|||||||
toDOM: () => ['div', 0]
|
toDOM: () => ['div', 0]
|
||||||
}))
|
}))
|
||||||
.name('suggestion')
|
.name('suggestion')
|
||||||
|
.extend('schema', () => ({
|
||||||
|
toDOM: () => ['div', 0],
|
||||||
|
}))
|
||||||
.create()
|
.create()
|
||||||
|
|
||||||
interface MentionOptions {
|
interface MentionOptions {
|
||||||
|
|||||||
Reference in New Issue
Block a user