microsoft / microsoft/TypeScript

Results of conditional types are not comparable (regression)

Offen
#30,049 1 Kommentar 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@weswigham arbeitet bereits daran.

Seit 27.2.2019.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

@RyanCavanaugh @weswigham @ahejlsberg Caused by #27697

TypeScript Version: 3.4.0-dev.20190222

Search Terms:

Code

type Falsy = undefined | false | 0 | '' | null | void;

type TEq<T, U> = [T] extends [U] ? [U] extends [T] ? true : false : false;
type If<S, T, U> = S extends Falsy ? U : T;

type StrictExtract<T, U> = T extends U ? U extends T ? T : never : never;
type StrictExclude<T, U> = T extends StrictExtract<T, U> ? never : T;

type ExcludeProp<T, V> =
  { [Q in { [P in keyof T]: If<TEq<V, never>, T[P] extends never ? never : P, If<Includes<T[P], V>, never, P>>; }[keyof T]]: T[Q]; };
type DeepExcludeProp<T, V, E extends object | undefined | null = never> =
  T extends E ? T :
  T extends V ? never :
  T extends readonly any[] | Function ? T :
  T extends object ? ExcludeProp<{ [Q in { [P in keyof T]: If<TEq<V, never>, T[P] extends never ? P : P, If<Includes<T[P], V>, T[P] extends E ? P : never, P>>; }[keyof T]]: StrictExclude<DeepExcludeProp<T[Q], V, E>, {}>; }, never> :
  T;
type Includes<T, U> = true extends (T extends U ? true : never) ? true : false;

type AD = { a: boolean; b: { a: boolean; b: boolean[]; c: undefined; d: undefined[]; e: boolean | undefined; f: Array<boolean | undefined>; }; c: { a: undefined; }; };

type a = DeepExcludeProp<AD, undefined, AD['b']>;
type b = ExcludeProp<AD, AD['c']>;
type c = {
  a: boolean;
  b: {
    a: boolean;
    b: boolean[];
    c: undefined;
    d: undefined[];
    e: boolean | undefined;
    f: Array<boolean | undefined>;
  };
};
type d = TEq<a, c>;
type e = TEq<b, c>;
type f = TEq<a, b>;

Expected behavior:

type d = TEq<a, c>; // true
type e = TEq<b, c>; // true
type f = TEq<a, b>; // true

Actual behavior:

type d = TEq<a, c>; // true
type e = TEq<b, c>; // true
type f = TEq<a, b>; // false

Playground Link:

Related Issues: #30047

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.