Typescript 仅排除和省略(拾取和排除)类型脚本的差异b/w

Typescript 仅排除和省略(拾取和排除)类型脚本的差异b/w,typescript,Typescript,根据的定义,它仅为所提到的属性构造一个新类型。与此相反 我见过以下用法 导出类型省略=拾取; 但我不太明白。我们可以简单地使用Exclude来省略非必填字段,并构造一种新类型的字段。为什么组合的拾取和排除用作省略 另一个例子: 函数removeName( 道具:道具 ):选择{ const{name,…rest}=props; //用名字做点什么。。。 返回休息; } 上面的返回类型不能用Exclude作为Exclude重新写入吗?关于Pick你是对的,它接受一个对象类型并提取指定的属性。因

根据的定义,它仅为所提到的属性构造一个新类型。与此相反

我见过以下用法

导出类型省略=拾取;
但我不太明白。我们可以简单地使用
Exclude
来省略非必填字段,并构造一种新类型的字段。为什么组合的
拾取
排除
用作
省略

另一个例子:

函数removeName(
道具:道具
):选择{
const{name,…rest}=props;
//用名字做点什么。。。
返回休息;
}

上面的返回类型不能用
Exclude
作为
Exclude
重新写入吗?

关于
Pick
你是对的,它接受一个对象类型并提取指定的属性。因此:

 Pick<{ a: string, b:string }, 'a' > === { a: string } 
排除
是另一个beast,它采用联合类型并删除该联合的一个组成部分

Exclude<string | number, string > === number
这意味着如果
T
扩展
U
,则
Exclude
将返回
never
,如果不扩展
T
,则返回
T
。这意味着:

  • 排除
    字符串
  • 排除
    从不
问题是条件类型。这意味着如果应用于工会,我们会得到以下结果:

Exclude<string | number, number>
    => Exclude<string, number> | Exclude<number, number> // Exclude distributes over string | number
    => string | never => // each application of Exclude resolved to either T or never
    => string  // never in unions melts away

实际上,我用它做了实验,并用Exclude替换了我的省略。在这种情况下,Typescript不会抛出错误<代码>导出类型NativeButtonProps={onClick:React.MouseEventHandler,htmlType?:ButtonHTMLType}&IBaseButtonProps&Exclude@kushalvm在这两种类型中,两个类型参数之间没有强制关系,因此它们将接受任何类型。区别在于他们做什么。我认为您使用的
Exclude
是一个错误,您实际上需要
省略
,因为您可能想删除键
type
onClick
Correct。我想取下这两把钥匙。如果它们是专门为特殊类型设计的。一个用于联合,另一个用于对象。在这种情况下,typescript不应该抛出错误,或者如果它只适用于联合类型,为什么它甚至应该接受对象。我可以用两者做同样的任务。希望,我们在这里达成一致@kushalvm
Exclude
只是一个条件类型,它利用了条件类型的分布特性。从根本上说,它所做的只是测试一种类型是否扩展了另一种类型。如果返回,则返回
从不
,否则返回类型。这在工会之外可能很有用,但在工会中最常用。也没有很好的方法来强制类型参数是一个联合,所以ts目前不能在这个问题上出现错误,即使它想这样做。另外,在实践中,
Exclude
通常用于测试看似不相关的类型。如果在类型参数之间强制建立关系,则会使其不太有用。是的。好东西!“操场悬停”-这就是我错过的,我想我要检查一下。
type Exclude<T, U> = T extends U ? never : T;
Exclude<string | number, number>
    => Exclude<string, number> | Exclude<number, number> // Exclude distributes over string | number
    => string | never => // each application of Exclude resolved to either T or never
    => string  // never in unions melts away
type T0 = Omit<{ a: string, b: string }, "a"> //  { b: string; }, a is removed 
type T1 = Exclude<{ a: string, b: string }, "a"> // { a: string, b: string }, a does not extend { a: string, b: string } so Exclude does nothing 

type T2 = Omit<string | number, string> // Attempts to remove all string keys (basically all keys) from string | number , we get {}
type T3 = Exclude<string | number, string> // string extends string so is removed from the union so we get number