improve types

This commit is contained in:
Philipp Kühn
2020-09-04 21:50:27 +02:00
parent 1c89e84239
commit 52d848ef1c

View File

@@ -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 {