如何解决当与受约束的泛型类型一起使用时,Typescript类型保护不能推断正确的类型
在下面的代码中,我希望data
具有智能感知提供的.company_id
属性。但是,我仅获得共同财产。请参见下图。
type UserPairingg = {pairing_type: 'user',user_id: number};
type CompanyPairingg = {pairing_type: 'company',company_id: number};
type Pairingg = UserPairingg | CompanyPairingg;
function parsee<T extends Pairingg>(data: T): T {
if (data.pairing_type === "company") {
data. // why doesn't it show company_id?
}
}
解决方法
很遗憾,TypeScript
尚无法实现。您要么必须显式转换它,要么使用predicate method:
type UserPairingg = {pairing_type: 'user',user_id: number};
type CompanyPairingg = {pairing_type: 'company',company_id: number};
type Pairingg = UserPairingg | CompanyPairingg;
function parsee<T extends Pairingg>(data: T): T {
// inline predicate
if (((d: Pairingg): d is CompanyPairingg => d.pairing_type === "company")(data)) {
data.company_id;
}
// function predicate
if (isCompanyPairing(data)) {
data.company_id;
}
return data;
}
function parsee2<T extends Pairingg>(data: T): T {
if (data.pairing_type === "company") {
const companyPairing = data as CompanyPairingg;
companyPairing.company_id;
}
return data;
}
function isCompanyPairing(data: Pairingg): data is CompanyPairingg {
return data.pairing_type === 'company';
}
,
如果您想更频繁地检查用户配对或公司配对,可以为此创建 type guards :
type UserPairing = {pairing_type: 'user',user_id: number};
type CompanyPairing = {pairing_type: 'company',company_id: number};
type Pairing = UserPairing | CompanyPairing;
function parse<T extends Pairing>(data: T): T {
if (isCompanyParing(data)) {
console.log(data.company_id);
}
if(isUserParing(data)) {
console.log(data.user_id);
}
return data;
}
function isCompanyParing(data: Pairing): data is CompanyPairing {
return data.pairing_type === 'company';
}
function isUserParing(data: Pairing): data is UserPairing {
return data.pairing_type === 'user';
}
,
您仍然需要强制转换您的“数据”。
(data as CompanyPairingg).company_id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。