Typescript 从另一个数据库中删除/筛选特定类型的属性
我想做如下的事情。我们有一个类型:Typescript 从另一个数据库中删除/筛选特定类型的属性,typescript,Typescript,我想做如下的事情。我们有一个类型: interface MyInterface { stringProp: string, numberProp: number } 我想创建一个实用程序类型,在给定另一种类型(如number或string)时,它会过滤掉该类型的属性,如下所示: /// Utility type, this is the thing I'm trying to define type TypeFiltered<T extends object, V>
interface MyInterface {
stringProp: string,
numberProp: number
}
我想创建一个实用程序类型,在给定另一种类型(如number
或string
)时,它会过滤掉该类型的属性,如下所示:
/// Utility type, this is the thing I'm trying to define
type TypeFiltered<T extends object, V> = ...
// Apply to MyInterface, number properties only
type MyInterfaceNumberProperties = TypeFiltered<MyInterface, number>
// MyInterfaceNumberProperties is
// { numberProp: number }
但这正是我被卡住的地方,对于MyInterface
,它有效地生成了具有以下内容的类型:
type ReplaceWithNever<T extends object, V> = {
[K in keyof T]: T[K] extends V ? T[K] : never
}
/// ReplaceWithNever<MyInterface, number>
{
myString: never,
myNumber: number
}
///ReplaceWithNever
{
myString:从来没有,
我的号码:号码
}
是否有一种方法可以从
keyof ReplaceWithNever
中筛选出项目,其中keyof ReplaceWithNever
生成never
?在TypeScript 4.1中,您可以使用(使用as
子句)通过将这些键重新映射到never
来筛选出属性:
// TS4.1+
type TypeFiltered<T extends object, V> = {
[K in keyof T as T[K] extends V ? K : never]: T[K]
}
任何一种方式都应产生相同的类型:
type MyInterfaceNumberProperties = TypeFiltered<MyInterface, number>
/* type MyInterfaceNumberProperties = {
numberProp: number;
} */
键入MyInterfaceEnumberProperties=TypeFiltered
/*类型MyInterfaceEnumberProperties={
numberProp:数字;
} */
在TypeScript 4.1中,您可以使用(使用
as
子句)通过将这些键重新映射到从不
来筛选属性:
// TS4.1+
type TypeFiltered<T extends object, V> = {
[K in keyof T as T[K] extends V ? K : never]: T[K]
}
任何一种方式都应产生相同的类型:
type MyInterfaceNumberProperties = TypeFiltered<MyInterface, number>
/* type MyInterfaceNumberProperties = {
numberProp: number;
} */
键入MyInterfaceEnumberProperties=TypeFiltered
/*类型MyInterfaceEnumberProperties={
numberProp:数字;
} */
简而言之,答案是:
type TypeFiltered < T extends object, V > = Pick < T, { [ P in keyof T ]: T[P] extends V ? P : never }[ keyof T ] >
type T = TypeFiltered < MyInterface, number > // { numberProp: number }
其次,使用索引访问运算符,从属性值具有特定类型的属性名称的并集类型:
type PropertyNamesFiltered < T extends object, V > = PropertyNamesOfTypeOrNever < T, V >[ keyof T ]
type Y = PropertyNamesFiltered < MyInterface, number > // "numberProp"
简单的回答是:
type TypeFiltered < T extends object, V > = Pick < T, { [ P in keyof T ]: T[P] extends V ? P : never }[ keyof T ] >
type T = TypeFiltered < MyInterface, number > // { numberProp: number }
其次,使用索引访问运算符,从属性值具有特定类型的属性名称的并集类型:
type PropertyNamesFiltered < T extends object, V > = PropertyNamesOfTypeOrNever < T, V >[ keyof T ]
type Y = PropertyNamesFiltered < MyInterface, number > // "numberProp"
指向游乐场的链接包含游乐场表示无效的代码。已更正。感谢您查看。操场的链接包含操场表示无效的代码。更正。谢谢你看。