TypeScript工程化类型系统

在 TypeScript 中提取两个类型的公共属性

比如


interface A1 {
  a: number;
  b: string;
}

interface B1 {
  a: number;
  c: boolean;
}

想得到一个

interface C1 {
  a: number;
}

初看会觉得是 A1 & B1,但其是不是的,这玩意儿同时具有 a, b, c, 三个属性。正确的确实应该用 &,但是是对 keyof 出来的东西,如下:

type BothKeyOf<A, B> = keyof A & keyof B;

type BothFieldsOf<A, B> = {
  [Key in BothKeyOf<A, B>]: A[Key] & B[Key]
};

type C = BothFieldsOf<A1, B1>;

const a: C = {a: 1};
const a2: C = {a: 1, b: '2'}; // 非法,多了 `b`
const a3: C = {}; // 非法,缺乏 `a`

Colliot4/27/2018, 1:53:06 AM

type A = {
    a: number
    b: string
}
type B = {
    a: string
    c: string
}
type C = {
    a: number
    c: string
}
type In<A, B> = A extends B ? A : never
type U<A, B> = {
    [K in In<keyof A, keyof B>]: A[K] extends B[K] ? B[K] extends A[K] ? A[K] : never : never
}


type D = U<A, B>
/*
type D = {
    a: never;
}
*/
type E = U<A, C>
/*
type E = {
    a: number;
}
 */

zuozijian37204/27/2018, 2:16:25 AM
type A = {
    a: number
    b: string
}
type B = {
    a: string
    c: string
}
type C = {
    a: number
    c: string
}
type In<A, B> = A extends B ? A : never
type U<A, B> = {
    [K in In<keyof A, keyof B>]: A[K] extends B[K] ? B[K] extends A[K] ? A[K] : never : never
}


type D = U<A, B>
/*
type D = {
    a: never;
}
*/
type E = U<A, C>
/*
type E = {
    a: number;
}
 */

——zuozijian3720

很强,用到了 conditional type,但是我可能用不了,因为 Angular 还不支持这么高的 TS 版本……

Colliot4/27/2018, 2:18:02 AM

不过倒是对我使用 conditional type 提了一个醒。

Colliot4/27/2018, 2:18:22 AM

不过倒是对我使用 conditional type 提了一个醒。

——Colliot
type A = {
    a: number
    b: string
}
type B = {
    a: string
    c: string
}
type C = {
    a: number
    c: string
}
type NeverO = { [key: string]: never }
type In<A, B> = ({ [K in keyof A]: K } & NeverO)[keyof B]
type U<A, B> = {
    [K in In<A, B>]: (A & NeverO)[K] | (B & NeverO)[K]
}

type D = U<A, B>
/*
type D = {
    a: number | string;
}
*/
type E = U<A, C>
/*
type E = {
    a: number;
}
 */
zuozijian37204/27/2018, 2:26:42 AM

fdasfasdfasdasfdsfasdfasdfsdfagfdsgsfdgsfdgsfdgsfdsfdsfdg

Colliot5/3/2018, 10:38:43 AM

预览:

取消

其他地方

sarasa 回复了 关于每个人访问都是我的事故原因,我有个猜测

什么鬼什么鬼什么鬼什么鬼

sarasa 回复了 IntelliJ 系列的「逐驼峰部件」能不能应用到补全上?

别说了,CLion和Goland成天给你补全一堆shi出来。

Colliot 回复了 IntelliJ 系列的「逐驼峰部件」能不能应用到补全上?

我平时就是这么用的,但是这并不符合我提出的要求

ice1000 回复了 IntelliJ 中按照驼峰移动光标的选项是啥来着?

File | Settings | Editor | General | Smart Keys 中的 `Use "CamelHump" words"

ice1000 回复了 IntelliJ 系列的「逐驼峰部件」能不能应用到补全上?

image 虎哥你可能还要学习一个

Colliot 回复了 如何输入公式中的微分算子?

看起来不错,还有什么推荐的吗?

Colliot 回复了 关于每个人访问都是我的事故原因,我有个猜测

为什么西西叫Axurez,为什么我叫Colliot

Colliot 回复了 关于每个人访问都是我的事故原因,我有个猜测

虎哥你懂吗,你懂你的身份吗

Colliot 回复了 关于每个人访问都是我的事故原因,我有个猜测

为什么我依然可以使用虎哥的身份