gpt4 book ai didi

typescript - 是否可以根据传入的对象推断对象类型?

转载 作者:行者123 更新时间:2023-12-04 00:49:38 27 4
gpt4 key购买 nike

我有各种共享一组公共(public)字段的文档。

我正在尝试创建一个函数,该函数将填充公共(public)字段,同时将唯一字段作为输入,从而生成完整的文档。

我可以正常工作,但现在我需要手动指定最终类型。我很好奇 typescript 中是否有一种方法可以根据传入的字段推断最终类型(或者如果传入的字段与任何已知的文档类型不匹配则抛出错误。

这是我现在拥有的代码:

type DocA = {
id: string,
createdAt: string,
onlyDocA: string
}

type DocB = {
id: string,
createdAt: string,
onlyDocB: string
}

type AllDocTypes = DocA | DocB

export const createBaseDocument = <DocType extends AllDocTypes>(
fields: Omit<DocType, 'id' | 'createdAt'>,
): DocType => {
const createdAt = new Date();

return {
id: generateId(),
createdAt: createdAt.toString(),
...fields,
} as DocType
}

function generateId(): string {
return 'id'
}

// testA should be of type `DocA`
const testA = createBaseDocument({ id: 'a', createdAt: '123', onlyDocA: 'hello'})

// testA should be of type `DocB`
const testB = createBaseDocument({ id: 'a', createdAt: '123', onlyDocB: 'hello'})

// testC should throw a type error
const testC = createBaseDocument({ id: 'a', createdAt: '123', onlyDocC: 'hello'})

// testD should throw a type error
const testD = createBaseDocument({ id: 'a', createdAt: '123', onlyDocA: 'hello', onlyDocB: 'hello'})

typescript playgroud

最佳答案

如果你想更好地控制函数中的内容,你可能想改用函数重载:

type DocA = {
id: string,
createdAt: string,
onlyDocA: string
}

type DocB = {
id: string,
createdAt: string,
onlyDocB: string
}

function createBaseDocument(fields: Omit<DocA, 'id'| 'createdAt'>): DocA;
function createBaseDocument(fields: Omit<DocB, 'id'| 'createdAt'>): DocB;
function createBaseDocument(fields: Omit<DocA, 'id'| 'createdAt'>|Omit<DocB, 'id'| 'createdAt'>): DocB|DocA{
const createdAt = new Date();
return {
id:generateId(),
createdAt: createdAt.toString(),
...fields
}
}

这样 createBaseDocument({onl​​yDocA:'a'})createBaseDocument({onl​​yDocB:'b'}) 就可以了,但是 createBaseDocument( {onlyDocA:'a',onlyDocB:'b'}) 会导致错误

关于typescript - 是否可以根据传入的对象推断对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67523380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com