typescript - 如何根据字符串值使接口属性有条件
问题描述
我有一个调用的函数getBooksPayload
,它返回一个包含 3 个属性的对象。几个对象属性是基于属性areBooksThereInLibrary
值的条件。
interface BooksList {
areBooksThereInLibrary: string;
numberOfHistoryBooks: number;
numberOfScienceBooks: number;
}
const getBooksPayload = (areBooksThereInLibrary: string):BooksList => {
if (areBooksThereInLibrary === 'No') {
return {
areBooksThereInLibrary: "No"
}
}
return {
areBooksThereInLibrary: 'Yes',
numberOfHistoryBooks: 10,
numberOfScienceBooks: 100
}
};
getBooksPayload("No");
默认情况下,我不想将属性设置为可选,如下所示:
interface BooksList {
areBooksThereInLibrary: string;
numberOfHistoryBooks?: number;
numberOfScienceBooks?: number;
}
努力编写映射的打字稿类型,其中几个属性(numberOfHistoryBooks
,numberOfScienceBooks
)根据属性值变为可选。
Below is the typescript playground link for a complete environment of this issue and in here the error is highlighted in red: https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgEIHt0GsDOAZYHMZAbwFgAoZZOKCDbHAFQAtoIBJEAgIyloCeALmREooAOYBuStRABXALY9oAeRgAJQmHRQBDXCIXLoMqsmMqo6gMoJgEEEgM4jSq2YC+lSgnQgiZAkIMBcABTgBABt0OAATZABeZAAKWnpMXFZ2Ll5+PRExSQBKIRcCQKSAPlJZZGAYVPSXbLpc4D5BJMTkgHIAOXRe4trzagB6ceQuZDAWQmQEOBwIABpkFnQAd1n0ZEU4LBQAA0s1TW1dfUycY5oQBNP3c7sHJwzGO-QABzBgfzgUQAdHVqHQwPIoCBRtRYTQ6C02G1uB18sJkAAiQYY5Cg5DecwEsEhSHQ8hjeEfLJIzgozoFZC9ACaEBwvVWeLO1guRCuLhEAEYAAwcilc2z2RzOG6CoVCuoEzxmSjBUI3CLRWJxFJY9AY4pAA
解决方案
你可以这样定义你BooksList
:
type BooksList = {
areBooksThereInLibrary: 'No';
} | {
areBooksThereInLibrary: 'Yes';
numberOfHistoryBooks: number;
numberOfScienceBooks: number;
}
如果您愿意,可以定义 2 个命名子接口并将其定义BooksList
为两者的联合。如果您以后想做一些类型保护,这可能会有所帮助。
推荐阅读
- sql-server - 为什么链接到 Access 时视图变为只读?
- mongodb - Hibernate OGM - java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1
- z3 - 如何从可满足的公式中恢复估值,关于模型的问题
- python - 在 python 中使用 winreg 打开注册表项时如何避免权限错误?
- javascript - 如何在Vue的A组件中预加载B组件的图像?
- php - Ajax post 值返回空
- verilog - 系统verilog开关不改变
- c# - 当我从另一个类调用数组时,数组不会更新
- bash - 类型 .git\HEAD 在 Windows 10 的 Git Bash 中不起作用
- c# - 用户在数组中删除指定的字符串?