Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 从另一个数据库中删除/筛选特定类型的属性_Typescript - Fatal编程技术网

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"

指向游乐场的链接包含游乐场表示无效的代码。已更正。感谢您查看。操场的链接包含操场表示无效的代码。更正。谢谢你看。