awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第十一题

Open semlinker opened this issue 3 years ago • 18 comments

实现一个 IsEqual 工具类型,用于比较两个类型是否相等。具体的使用示例如下所示:

type IsEqual<A, B> = // 你的实现代码

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

请在下面评论你的答案。

semlinker avatar Sep 16 '21 12:09 semlinker

type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false;

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }>; // true
type E2 = IsEqual<[1], []>; // false

sunboyZgz avatar Sep 16 '21 12:09 sunboyZgz

// 第一道
type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false;

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }>; // true
type E2 = IsEqual<[1], []>; // fals
type E3 = IsEqual<{ a: 1, b: 2 }, { a: 1 }>; // false
type E4 = IsEqual<{ a: 1 }, { a: 1, b: 2 }>; // false

zhaoxiongfei avatar Sep 16 '21 14:09 zhaoxiongfei

type IsEqual<A, B> = A extends B ? B extends A ? true : false : false

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

gitivon avatar Sep 17 '21 03:09 gitivon

type IsEqual<A, B> = ((t: A, p: B) => void) extends (...args: infer R) => void ? 
(R[number] extends A ? true : false) : false

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

douhao1988 avatar Sep 17 '21 14:09 douhao1988

type IsEqual<T, U> =
	(<G>() => G extends T ? 1 : 2) extends
	(<G>() => G extends U ? 1 : 2)
		? true
		: false;

//test case, it is special
type X=IsEqual<{x:any}, {x:number}>;   // false

https://github.com/microsoft/TypeScript/issues/27024#issuecomment-421529650

869288142 avatar Sep 19 '21 03:09 869288142

type IsEqual<T, U> = T extends U ? U extends T ? true : false : false;
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

mingzhans avatar Sep 21 '21 14:09 mingzhans

type IsEqual<A, B> = A extends B ? B extends A ? true : false : false

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

Mrlgm avatar Sep 27 '21 12:09 Mrlgm

type IsEqual<A, B> = // 你的实现代码

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false
type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false;

winfa avatar Sep 27 '21 15:09 winfa

// 实现一个 IsEqual 工具类型,用于比较两个类型是否相等。具体的使用示例如下所示:

type IsEqual<A, B> = [A] extends [B] ? [B] extends [A] ? true : false: false;

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false
type E3 = IsEqual<never, never>; // true
type E4 = IsEqual<1 | 2, 2 | 1>; // true
type E5 = IsEqual<any, any>; // true

此题需要考虑联合类型以及never的问题,因此用 [] 将联合类型处理一下,避免分发处理。

zhaoxiongfei avatar Oct 01 '21 15:10 zhaoxiongfei

type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false;

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }>; // true
type E2 = IsEqual<[1], []>; // false

type E2 = IsEqual<never, never>; // never 这个不完美

LesixCoder avatar Nov 26 '21 14:11 LesixCoder

export default {}

// 实现一个 IsEqual 工具类型,用于比较两个类型是否相等。具体的使用示例如下所示: type IsEqual<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false

// 测试用例 type E0 = IsEqual<1, 2>; // false type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true type E2 = IsEqual<[1], []>; // false type E3 = IsEqual<true, false> type E4 = IsEqual<1 | 2, 2 | 1>

a572251465 avatar Dec 01 '21 14:12 a572251465

type IsEqual<A, B> = A extends B ? B extends A ? true : false : false;

liulise avatar Dec 07 '21 03:12 liulise

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

type IsEqual<A, B> = 
A extends B
  ? B extends A
    ? true
    : false
  : false

waleiwalei avatar Mar 11 '22 08:03 waleiwalei

type IsEqual<T, U> =
	(<G>() => G extends T ? 1 : 2) extends
	(<G>() => G extends U ? 1 : 2)
		? true
		: false;

//test case, it is special
type X=IsEqual<{x:any}, {x:number}>;   // false

https://github.com/microsoft/TypeScript/issues/27024#issuecomment-421529650

@869288142 这个答案大佬能给详细解释下吗... 链接失效了

ChangerHe avatar May 27 '22 03:05 ChangerHe

type IsEqual<A, B> = A extends B ? 
                    B extends A ? 
                    true : 
                    false :
                    false

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true
type E2 = IsEqual<[1], []>; // false

YJCCreateAHistory avatar May 27 '22 12:05 YJCCreateAHistory

type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false; 有点想不明白 A extends B 跟 B extends A 不是一个道理么? 为何不 type IsEqual<A, B> = A extends B ? true : false; 这样 求解释

itcast-e avatar Aug 18 '22 08:08 itcast-e

type IsEqual<A, B> = A extends B ? (B extends A ? true : false) : false; 

// 测试用例
type E0 = IsEqual<1, 2>; // false
type E1 = IsEqual<{ a: 1 }, { a: 1 }>; // true
type E2 = IsEqual<[1], []>; // false

fishcoderman avatar Aug 25 '22 14:08 fishcoderman

type IsEqual<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false // 测试用例 type E0 = IsEqual<1, 2>; // false type E1 = IsEqual<{ a: 1 }, { a: 1 }> // true type E2 = IsEqual<[1], []>; // false

zcc0329 avatar Sep 26 '22 09:09 zcc0329