函数参数中TypeScript类型区分的并集


函数的第二个参数的类型取决于第一个参数的字符串值。我想要这样的东西:
async action (name: 'create', args: { table: string, object: StorageObject }): Promise<StorageObject>;
async action (name: 'createOrUpdate', args: { table: string, query: StorageQuery, object: StorageObject }): Promise<Array<StorageObject>>;
async action (name: 'read', args: { table: string, query: StorageQuery }): Promise<Array<StorageObject>>;
async action (name: 'update', args: { table: string, query: StorageQuery, object: StorageObject }): Promise<Array<StorageObject>>;
async action (name: 'delete', args: { table: string, query: StorageQuery }): Promise<Array<StorageObject>> {
...
}

目前,我有:TS2394: This overload signature is not compatible with its implementation signature.

当您进行重载时,实现签名需要与每个重载兼容。顺便说一句,最后一个签名不会在.d.ts中公开

async action(name: 'create', args: { table: string, object: StorageObject }): Promise<StorageObject>;
async action(name: 'createOrUpdate', args: { table: string, query: StorageQuery, object: StorageObject }): Promise<Array<StorageObject>>;
async action(name: 'read', args: { table: string, query: StorageQuery }): Promise<Array<StorageObject>>;
async action(name: 'update', args: { table: string, query: StorageQuery, object: StorageObject }): Promise<Array<StorageObject>>;
async action(name: 'delete', args: { table: string, query: StorageQuery }): Promise<Array<StorageObject>>;
// The actual implementation that needs to cover every case above 
async action(name: 'create' | 'delete' | 'update' | 'read' | 'createOrUpdate', args: { table: string, query: StorageQuery, object: StorageObject }): Promise<Array<StorageObject> | StorageObject> {
if (name === 'create' || name === 'delete') {
return Promise.resolve(new StorageObject())
}
return Promise.resolve([new StorageObject()])
}

游乐场

最新更新