typescript - “Pick” 一个匿名类型的特定实现
这是一些类型和一个函数的示例:
type testM3 = { a: 'gggg', other: 'fggfg' }
type totalM = { a: '123', result: { something: '4444' }}| { a: '321' } | testM3 | null
// basically I want something like : totalM['a' === '123']
function funcc2(input: totalM): ? { <-- this is what I have no idea how to specify return type
if(input && 'result' in input){ // maybe this somehow?
return input
}
if(input && input.a === '321'){ // or this?
return input
}
return null
}
我想指定一个特定的返回类型。在这种情况下,我想返回的类型是“匿名”的那个,其中包含“result”。由于它不是一个具体命名的类型,我不能直接说类似 : testM3 的东西。我可以直接说返回值是 : { a: '123', result: '4444' }。但是这只适用于类型较小的情况。如果示例返回值包含50个不同的子属性,那就不可行了。而且我无法控制 totalM 类型,所以我不能仅仅改变类型本身。有没有一种简单的方法像 totalM['a' === '123'] 这样“提取”实现呢?这不是为了选择一个特定的返回值,而是为了返回整个返回对象。所以,我想像 Pick<> 这样的方式可能行不通。
我在 TypeScript 文档中找不到任何合适的内容。我认为这可能被称为区分联合类型,但一些建议是,要么修改总类型本身(我无法做到),要么有自定义实现,这可以使用,但大多数解决方案都有好几年历史了。所以我想知道是否有一个简单快速的解决方案。
答案#1
第二次缩小是可以的,只要记得修正为 '123'。你不需要担心返回类型,TS 会正确推断。另外,将其做成一个单独的类型以便复用:
操场
type testM3 = { a: 'gggg', other: 'fggfg' }
type testM1 = { a: '123', result: { something: '4444' }};
type totalM = testM1 | { a: '321' } | testM3 | null
function funcc2(input: totalM){
if(input?.a === '123'){
return input
}
return null
}
