【发布时间】:2021-06-23 23:09:28
【问题描述】:
有大量关于基于值的条件类型的问题。 但是我不确定是否可以实现以下场景。
我开始熟悉条件类型,我想知道是否可以创建一个依赖于非空字符串的条件类型。
让我们考虑下一个界面:
interface Animal {
dogName: string;
canBark: boolean;
}
和
interface AnimalToBeMapped {
dogsNickname?: string;
/// some other props
}
我正在使用这个接口来映射一个对象
function mapAnimal(animal: AnimalToBeMapped): Animal {
return {
dogName: animal.dogsNickname,
canBark: !animal.dogsNickname
}
}
仅当参数对象具有dogName 属性集时,我才将canBark 属性设置为true(也应适用于空字符串与非空字符串)。
我想要做的是为我的Animal 接口添加额外的类型安全(如果有人手动设置dogName 来定义,那么我想强制canBark 属性为true,反之亦然)。
示例:
const exmpl1: Animal = {
dogName: 'Rex',
canBark: false // I want an error here
}
和
const exmpl2: Animal = {
dogName: '',
canBark: true // An error here
}
【问题讨论】:
-
您愿意接受任何解决方法吗?例如,可以创建一个接受两个参数(dogName 和 canBark)的函数吗?还是键入 wirh 泛型参数?
-
在我看来,您正在尝试一些不是 TypeScript 设计的东西。 TypeScript 编译为 JavaScript,因此任何动态 runtime 行为都无法通过 TypeScript 键入功能强制执行。您提供的示例包含硬编码值,这些值将在编译时进行检查。但是当我读到“如果有人手动设置
dogName来定义然后我想强制canBark属性为真,反之亦然”之类的内容时,我想到了处理用户输入或API 获取结果等场景。你在那里不走运。您需要为此编写验证逻辑。
标签: typescript