通过一个属性更改将现有类型转换为新类型

齐麦克

如何通过一个属性更改将现有类型转换为新类型?

打字提示沙箱

例子:

type SomeComplexType = string // just for example

// cannot be changed
type Options<T> = {
    opt1: boolean | undefined;
    opt2: number;
    opt3?: SomeComplexType;
    opt4: T
}

// Can be changed

// How to change opt1 to accept only true and infer other option types?
type Keys = keyof Options<any>

let r: { [K in Keys]: K extends 'opt1' ? true : any }

// Good (should work)
r = { opt1: true, opt2: 2, opt3: '1', opt4: 1 }
r = { opt1: true, opt2: 2, opt3: '1', opt4: 'str' }

// Bad (should be error)
r = { opt1: false, opt2: 1, opt3: 'str', opt4: 1 } // opt1 should be true
r = { opt1: true, opt2: 'str', opt3: 'str', opt4: 1 } // opt2 should be number
r = { opt1: true, opt2: 'str', opt3: 1, opt4: 1 } // opt3 should be 
杰卡兹

如果您有一个对象类型O并且想要创建一个新类型,其中所有属性键和值都相同,但键处的属性opt1应该是true,您可以这样编写:

{ [K in keyof O]: K extends 'opt1' ? true : O[K] }

语法O[K]索引访问,意思是“具有类型O的属性的类型K”。

那么您的示例应该可以正常工作,(假设OOptions<any>):

// Good 
r = { opt1: true, opt2: 2, opt3: '1', opt4: 1 } // okay
r = { opt1: true, opt2: 2, opt3: '1', opt4: 'str' } // okay

// Bad 
r = { opt1: false, opt2: 1, opt3: 'str', opt4: 1 } // error!
r = { opt1: true, opt2: 'str', opt3: 'str', opt4: 1 } // error!
r = { opt1: true, opt2: 'str', opt3: 1, opt4: 1 } // error!

Playground 链接到代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java将类型对象的ArrayList转换为另一个类型对象的ArrayList

将双精度类型转换为另一个数字类型

通过反射将类型“ interface {}”转换为类型“ interface {}”的切片中的另一个接口

如何将一个reflect.Type转换为其ptr类型?

如何通过元素的属性将一个集合转换/转换为另一个集合?

为什么将类型T&转换为T会创建一个临时的?

使用类型超集将std :: variant转换为另一个std :: variant

无法将long类型转换为T,这里T是一个Enum的值

C#LINQ GroupBy通过将一个列表转换为具有一个属性作为值列表的组

无法将类型强制转换为(Int),因为<variable>是一个局部变量,可以通过更改闭包来捕获

无法将类型强制转换为“ ListViewModel”,因为“ binding.listViewModel”是一个可变的属性,此时可能已更改

将元组类型转换为另一个元组类型

将Data.Typeable.cast转换为现有类型

为什么将通用返回类型强制转换为另一个通用类型?

我收到一个错误“将数据类型nvarchar转换为实数时出错”。

如何将一个结构转换为具有相同成员的另一种类型?

将具有一个字段(对象类型)的Json对象转换为对象的json数组

如何从XML将多种节点元素类型转换为一个变量

无法将类型为PageViewController的值强制转换为另一个Controller

存储类型并以编程方式将另一个变量转换为存储的类型

如果将通用类型转换为其基础的已区分联盟,则将其转换为一个通用类型

jq 通过转换现有的来创建一个新的 json

javascript 将一个新数组映射到一个添加新属性的现有数组上

如何在 Typescript 中将给定类型的所有属性转换为另一个类型?

如何通过在Typescript中使用模式操作属性来基于现有类型生成新类型

声明一个将日期数据类型转换为整数的变量

将列表转换为具有新属性名称的另一个新列表

TypeScript 复制现有界面但更改一个属性的类型

通过现有对象的属性值创建一个新的对象数组将现有对象添加到新数组