TypeScriptforEach如何推断联合的类型并更改返回类型
我们想要获取一个文档类型并改变它的一些字段,然后返回具有新类型的新文档。我们想根据一组值(collectionDataFields在下面的示例中)来确定要改变的字段。
type AllDocuments = {
__typename: 'cat'
a: '123',
b: '123',
z: 'xyz'
} | {
__typename: 'dog'
a: '123',
c: '123',
z: 'xyz'
}
const collectionDateFields = {
cat: ['a', 'b'],
dog: ['a', 'c']
} as const
export const useStringsToNums = (document: AllDocuments) => {
const dateFields = collectionDateFields[document.__typename]
dateFields.forEach((field) => {
document[field] = parseInt(document[field])
})
return document
}
在示例中,dateFields输入为,readonly ["a", "b"] | readonly ["a", "c"]但个人输入field为any。
在document返回的AllDocuments,虽然我们希望它有改变的类型的字段(如一个连number)。
TS 游乐场示例
编辑:对于用法的一个例子,我会做这样的事情:
useStringsToNums({
__typename: 'cat'
a: '123',
b: '123',
z: 'xyz'
})
在这种情况下,该函数将匹配的属性__typename: 'cat'转换为数字(带有parseInt)。