我有一个这样的函数:
interface Interface1 {
one: string
}
interface Interface2 {
two: string
}
interface Interface3 {
three: string
}
type ManyInterfacesInOneType = Interface1 | Interface2 | Interface3;
function bla(param1: ManyInterfacesInOneType) {
}
当我尝试使用这样的函数并调用该函数时bla({...})
,它允许我放置来自所有接口的变量,但我希望该函数仅限于众多接口中的一个。所以我不希望这种情况发生:
bla({one: '', two: '', three: ''});
我也尝试这样做:
function bla<T extends object>(param1: T) {
}
但这并不需要泛型类型,因此它甚至没有真正的帮助。
我有什么想法可以让这项工作成功吗?
可以用小助手来做:
interface Interface1 {
one: string
}
interface Interface2 {
two: string
}
interface Interface3 {
three: string
}
type Union = Interface1 | Interface2 | Interface3;
// credits goes to https://stackoverflow.com/questions/65805600/type-union-not-checking-for-excess-properties#answer-65805753
type UnionKeys<T> = T extends T ? keyof T : never;
type StrictUnionHelper<T, TAll> =
T extends any
? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>
function bla<T extends Union,>(param1: StrictUnion<Union>) {
}
bla({ one: 'one' }) // ok
bla({one:'one', two:'two'}) // error
操场 https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgJLmvJBGZBvAKGWOQHsQIAuZAZzClAHMCBfA0SWRFdTrCAEz4iJMAHdS1OgxDM2HTNzQYuSAMzCSyMAAsoEKrXpNWBMAE8ADigCqIYOWQBeZX264APq8VIhX3j4QagDcBAQA9OHICPoAJsBgNMiMpBBJYKTIOmBgljSUkXSIANakAG6YADakYgB0CKQAtuEAjgCuaWAOIDThAGwArAAcAAwDfSMj4RbWALRt9uSzIKRgswg6EAjFTLMwpFCzEAAeSDQ0s5ZQpNZQXWkAxHA9YtCzg6MDAOwDamZWtkWIAA0hBzDQADwAFQAfM5kFDkCdICBYklEQB%20ZDFMGkGAI5DUCgVKChGYoADKxgQYDs3QAEhBKrdoQAaBEAQUqlThThExERyIgqKSz3M-OQWMRADJkAAFOB3YBwSoQgBKWwOsQhAFFTpU2rEIBC6eRQeDoVyeeyceY8QiYezidAYXCiRASaF-tZkFSGDTTSBobzfdTaUDGczoGyHWECDAFjTusgAEaVODQpHHFFo5CB1kwgAUlkVcEa2GofuAAaBJqBMIAlMJTAQ03BC3gyBRqABycgQHvIFhNyJkYqt9Md-uUPsUHvs8SSHuLnvD5Cj6DXKBAA
Here https://catchts.com/,在我的博客中,您可以找到更多在实践中有用的实用程序类型的示例,因为所有这些示例都取自此处(stackoverflow)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)