Previously, intersections were only allowed as targets, but this was just an artifact of the original implementation, which operated inside the structural part of isRelatedTo. Removing this restriction catches subtle bugs in React user code, where a function named `create` returns a mapped type whose types are all branded numbers. The display of these properties, for some original type `T`, is not `number & { __ }` but the much-less-obvious `RegisteredStyle<T>`.
18 lines
541 B
TypeScript
18 lines
541 B
TypeScript
interface X { x: string }
|
|
interface Y { y: number }
|
|
interface Z { z?: boolean }
|
|
|
|
type XY = X & Y;
|
|
const xy: XY = {x: 'x', y: 10};
|
|
|
|
const z1: Z = xy; // error, {xy} doesn't overlap with {z}
|
|
|
|
|
|
interface ViewStyle {
|
|
view: number
|
|
styleMedia: string
|
|
}
|
|
type Brand<T> = number & { __brand: T }
|
|
declare function create<T extends { [s: string]: ViewStyle }>(styles: T): { [P in keyof T]: Brand<T[P]> };
|
|
const wrapped = create({ first: { view: 0, styleMedia: "???" } });
|
|
const vs: ViewStyle = wrapped.first // error, first is a branded number
|