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) {
  }
}