我有一些扩展:
type ExtensionOptions = { name: string }
type BoldOptions = ExtensionOptions & { boldShortcut?: string }
type ItalicOptions = ExtensionOptions & { italicShortcut?: string }
type LinkOptions = ExtensionOptions & { autoLink?: boolean }
declare class Extension {
constructor(options: ExtensionOptions)
}
declare class BoldExtension extends Extension {
isSelectionBold: boolean
constructor(options: BoldOptions)
}
declare class ItalicExtension extends Extension {
isSelectionItalic: boolean
constructor(options: ItalicOptions)
}
declare class LinkExtension extends Extension {
isSelectionLink: boolean
constructor(options: LinkOptions)
}
我想创建一个数组类型,这样我就可以传递带有扩展的元组和它的带有智能感知的选项.例如:
// Generic type. It works but without intellisense
type Extensions = Array<[Extension, ExtensionOptions]>
const extensions = [
[BoldExtension, { name: 'italic' }],
[ItalicExtension, { name: 'italic' }],
[LinkExtension, { name: 'link', autoLink: true }] // Need intellisense for LinkExtension here
]
我试着做了一些实验:
type Extensions<T> = Array<[
T,
T extends new (...args: infer Options) => any
? Options[0] // we know that first argument is the `options`
: never
]>
如果你想看一下,这是TypeScript playground link元.