作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有很多关于基于值的条件类型的问题。
但是我不确定下面的场景是否可以实现。
我正在熟悉条件类型,我想知道是否可以创建一个依赖于非空字符串的条件类型。
让我们考虑下一个界面:
interface Animal {
dogName: string;
canBark: boolean;
}
和
interface AnimalToBeMapped {
dogsNickname?: string;
/// some other props
}
我正在使用这个接口(interface)来映射一个对象
function mapAnimal(animal: AnimalToBeMapped): Animal {
return {
dogName: animal.dogsNickname,
canBark: !animal.dogsNickname
}
}
我正在设置
canBark
属性(property)给
true
仅当参数对象具有
dogName
属性集(也应该适用于空字符串与非空字符串)。
Animal
添加额外的类型安全性。接口(interface)(如果有人手动设置
dogName
来定义,那么我想强制
canBark
属性为
true
,反之亦然)。
const exmpl1: Animal = {
dogName: 'Rex',
canBark: false // I want an error here
}
和
const exmpl2: Animal = {
dogName: '',
canBark: true // An error here
}
最佳答案
请让我知道它是否适合您
type NonEmptyString<T extends string> = T extends '' ? never : T;
type WithName = {
dogName: string,
canBark: true,
}
type WithoutName = {
dogName?: '',
canBark: false
};
type Animal = WithName | WithoutName;
type Overloadings =
& ((arg: { canBark: false }) => Animal)
& ((arg: { dogName: '', canBark: false }) => Animal)
& (<S extends string>(arg: { dogName: NonEmptyString<S>, canBark: true }) => Animal)
const animal: Overloadings = (arg: Animal) => {
return arg
}
const x = animal({ dogName: '', canBark: false }) // ok
const xx = animal({ dogName: 'a', canBark: true }) // ok
const xxx = animal({ dogName: 'a', canBark: false }) // error
const xxxx = animal({ dogName: '', canBark: true }) // error
const xxxxx = animal({ canBark: true }) // error
const xxxxxx = animal({ canBark: false }) // ok
Playground
string
可分配给文字类型
''
(空字符串),这就是我使用
NonEmptyString
的原因 helper
type WithName = {
dogName: string,
canBark: true,
}
type WithoutName = {
canBark: false
};
type Animal = WithName | WithoutName;
const x: Animal = {
dogName: 'name',
canBark: true
}; // ok
const xx:Animal={
canBark:false
}; // ok
const xxx:Animal={
canBark:true
} // expected error
const xxxx:Animal={
dogName:''
} // expected error
Playground
关于typescript - 基于非空字符串的条件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66828502/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!