Typescript 函数参数接受其中一个的类类型';s的属性是类型缩小
类具有联合类型属性。函数使用类型缩小属性接受此类。我可以定义这样的函数吗 我有一张登录表。用户需要相应地输入电话、密码或短信代码。这是登录表单类定义Typescript 函数参数接受其中一个的类类型';s的属性是类型缩小,typescript,Typescript,类具有联合类型属性。函数使用类型缩小属性接受此类。我可以定义这样的函数吗 我有一张登录表。用户需要相应地输入电话、密码或短信代码。这是登录表单类定义 导出类PhoneLoginForm{ 公用电话:字符串; 公共授权形式:PhonePasswordLoginForm | PhonesSloginForm; } 导出类PhonePasswordLoginForm{ 公共密码:字符串; 公共验证码:字符串; } 导出类PhonesSloginForm{ 公共短信:字符串; } 还有过程函数 pub
导出类PhoneLoginForm{
公用电话:字符串;
公共授权形式:PhonePasswordLoginForm | PhonesSloginForm;
}
导出类PhonePasswordLoginForm{
公共密码:字符串;
公共验证码:字符串;
}
导出类PhonesSloginForm{
公共短信:字符串;
}
还有过程函数
public onLogin(loginForm:PhoneLoginForm){
if(loginForm.authForm实例of PhonePasswordLoginForm){
processPhonePasswordForm(loginForm);
}否则{
ProcessPhonesForm(loginForm);
}
}
//如何约束loginForm.authForm是PhonePasswordLoginForm?
公共进程PhonePasswordForm(loginForm:PhoneLoginForm){
//使用loginForm.phone、loginForm.authForm.password、loginForm.authForm.captcha进行身份验证。
}
//如何约束loginForm.authForm是PhonesSloginForm?
公共进程PhonesForm(loginForm:PhoneLoginForm){
//通过loginForm.phone、loginForm.authForm.sms进行身份验证。
}
我在typescript文档或github问题中找不到这种语法。有可能定义这样的函数吗
谢谢你的回答 我会这样做 首先,必须根据需要准确定义类型:
export type PhoneLoginForm = PhoneLoginFormWithSms | PhoneLoginFormWithPassword;
export interface PhoneLoginFormWithSms {
phone: string;
authForm: PhoneSmsLoginForm;
}
export interface PhoneSmsLoginForm {
sms: string;
}
export interface PhoneLoginFormWithPassword {
phone: string;
authForm: PhonePasswordLoginForm;
}
export interface PhonePasswordLoginForm {
password: string;
captcha: string;
}
可以实施:
export function isPhoneLoginFormWithSms(loginForm: PhoneLoginForm): loginForm is PhoneLoginFormWithSms {
return !!loginForm.authForm["sms"]
}
export function isPhoneLoginFormWithPassword(loginForm: PhoneLoginForm): loginForm is PhoneLoginFormWithPassword {
return loginForm.authForm["password"] !== undefined
}
现在可以轻松使用以下类型:
function onLogin(loginForm: PhoneLoginForm) {
if (isPhoneLoginFormWithPassword(loginForm)) {
processPhonePasswordForm(loginForm);
} else {
processPhoneSmsForm(loginForm);
}
}
function processPhonePasswordForm(loginForm: PhoneLoginFormWithPassword) {
}
function processPhoneSmsForm(loginForm: PhoneLoginFormWithSms) {
}
关于类型的实现,请举一个类的示例:
class PhoneLoginFormWithSmsImpl implements PhoneLoginFormWithSms {
constructor(public phone: string, public authForm: PhoneSmsLoginForm) {
}
}
class PhoneLoginFormWithPasswordImpl implements PhoneLoginFormWithPassword {
constructor(public phone: string, public authForm: PhonePasswordLoginForm) {
}
}
我会这样做的 首先,必须根据需要准确定义类型:
export type PhoneLoginForm = PhoneLoginFormWithSms | PhoneLoginFormWithPassword;
export interface PhoneLoginFormWithSms {
phone: string;
authForm: PhoneSmsLoginForm;
}
export interface PhoneSmsLoginForm {
sms: string;
}
export interface PhoneLoginFormWithPassword {
phone: string;
authForm: PhonePasswordLoginForm;
}
export interface PhonePasswordLoginForm {
password: string;
captcha: string;
}
可以实施:
export function isPhoneLoginFormWithSms(loginForm: PhoneLoginForm): loginForm is PhoneLoginFormWithSms {
return !!loginForm.authForm["sms"]
}
export function isPhoneLoginFormWithPassword(loginForm: PhoneLoginForm): loginForm is PhoneLoginFormWithPassword {
return loginForm.authForm["password"] !== undefined
}
现在可以轻松使用以下类型:
function onLogin(loginForm: PhoneLoginForm) {
if (isPhoneLoginFormWithPassword(loginForm)) {
processPhonePasswordForm(loginForm);
} else {
processPhoneSmsForm(loginForm);
}
}
function processPhonePasswordForm(loginForm: PhoneLoginFormWithPassword) {
}
function processPhoneSmsForm(loginForm: PhoneLoginFormWithSms) {
}
关于类型的实现,请举一个类的示例:
class PhoneLoginFormWithSmsImpl implements PhoneLoginFormWithSms {
constructor(public phone: string, public authForm: PhoneSmsLoginForm) {
}
}
class PhoneLoginFormWithPasswordImpl implements PhoneLoginFormWithPassword {
constructor(public phone: string, public authForm: PhonePasswordLoginForm) {
}
}