当使用可以同时是联合类型情况的参数调用函数时,有没有办法让 TypeScript 编译器产生错误?例子:
interface Name {
name: string
}
interface Email {
email: string
}
type NameOrEmail = Name | Email
function print(p: NameOrEmail) {
console.log(p)
}
print({name: 'alice'}) // Works
print({email: 'alice'}) // Works
print({email: 'alice', name: 'alice'}) // Works, but I'd like it to fail
print({email: 'alice', age: 33}) // Doesn't work
您可以使用方法重载:
interface Name {
name: string
}
interface Email {
email: string
}
function print(p: Name): void;
function print(p: Email): void;
function print(p: Name | Email) {
console.log(p);
}
print({name: 'alice'}) // Works
print({email: 'alice'}) // Works
print({email: 'alice', name: 'alice'}) // Doesn't work
print({email: 'alice', age: 33}) // Doesn't work
这基本上将使方法实现的签名对代码的其余部分“不可见”。
Demo https://www.typescriptlang.org/play/#src=interface%20Name%20%7B%0D%0A%20%20name%3A%20string%0D%0A%7D%0D%0A%0D%0Ainterface%20Email%20%7B%0D%0A%20%20email%3A%20string%0D%0A%7D%0D%0A%0D%0Afunction%20print(p%3A%20Name)%3A%20void%3B%0D%0Afunction%20print(p%3A%20Email)%3A%20void%3B%0D%0Afunction%20print(p%3A%20Name%20%7C%20Email)%3A%20void%20%7B%0D%0A%20%20console.log(p)%3B%0D%0A%7D%0D%0A%0D%0Aprint(%7Bname%3A%20'alice'%7D)%20%2F%2F%20Works%0D%0Aprint(%7Bemail%3A%20'alice'%7D)%20%2F%2F%20Works%0D%0Aprint(%7Bemail%3A%20'alice'%2C%20name%3A%20'alice'%7D)%20%2F%2F%20Works%2C%20but%20I'd%20like%20it%20to%20fail%0D%0Aprint(%7Bemail%3A%20'alice'%2C%20age%3A%2033%7D)%20%2F%2F%20Doesn't%20work
Edit:
正如 @str 在严格模式下所指出的,重载签名需要指定返回类型。只要实现与可见签名中指定的返回类型兼容,仍然可以推断其返回类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)