Includes
介绍
在类型系统里实现 JavaScript 的 Array.includes
方法,这个类型接受两个参数,返回的类型要么是 true
要么是 false
。
例如
ts
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'>; // expected to be `false`
View on GitHubts
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'>; // expected to be `false`
起点
ts
/* _____________ Your Code Here _____________ */typeIncludes <T extends readonly any[],U > = any;/* _____________ Test Cases _____________ */typecases = [Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Kars'>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3, 5, 6, 7], 7>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3, 5, 6, 7], 4>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3], 2>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3], 1>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{}], {a : 'A' }>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[boolean, 2, 3, 5, 6, 7], false>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[true, 2, 3, 5, 6, 7], boolean>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[false, 2, 3, 5, 6, 7], false>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{a : 'A' }], { readonlya : 'A' }>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{ readonlya : 'A' }], {a : 'A' }>, false>>];
take the challengets
/* _____________ Your Code Here _____________ */typeIncludes <T extends readonly any[],U > = any;/* _____________ Test Cases _____________ */typecases = [Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Kars'>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3, 5, 6, 7], 7>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3, 5, 6, 7], 4>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3], 2>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[1, 2, 3], 1>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{}], {a : 'A' }>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[boolean, 2, 3, 5, 6, 7], false>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[true, 2, 3, 5, 6, 7], boolean>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[false, 2, 3, 5, 6, 7], false>, true>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{a : 'A' }], { readonlya : 'A' }>, false>>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <Includes <[{ readonlya : 'A' }], {a : 'A' }>, false>>];
解决方案
Spoiler warning // Click to reveal answer
ts
typeIncludes <T extends any[],U > = {[P inT [number]]: true}[U ] extends true ? true : false// 存在问题/*** 1.只满足propertyKey类型判断* 2.对象类型判断失效 [{}][]* 3.联合类型判断失效 Includes<[boolean], false> Includes<[null|undefined], null>*/
ts
typeIncludes <T extends any[],U > = {[P inT [number]]: true}[U ] extends true ? true : false// 存在问题/*** 1.只满足propertyKey类型判断* 2.对象类型判断失效 [{}][]* 3.联合类型判断失效 Includes<[boolean], false> Includes<[null|undefined], null>*/
ts
// 方案2typeIsEqual <T ,U > =(<G >() =>G extendsT ? 1 : 2) extends(<G >() =>G extendsU ? 1 : 2)? true: false;typeIncludes <T extends any[],U > =IsEqual <T [0],U > extends true? true:T extends [T [0], ...inferrest ]?Includes <rest ,U >: false;// 存在的问题 Includes<[], undefined>返回true
ts
// 方案2typeIsEqual <T ,U > =(<G >() =>G extendsT ? 1 : 2) extends(<G >() =>G extendsU ? 1 : 2)? true: false;typeIncludes <T extends any[],U > =IsEqual <T [0],U > extends true? true:T extends [T [0], ...inferrest ]?Includes <rest ,U >: false;// 存在的问题 Includes<[], undefined>返回true
ts
// 方案3typeIncludes <T ,U > =T extends [inferF , ...inferRest ]?F extendsU ? true :Includes <Rest ,U >: false;
ts
// 方案3typeIncludes <T ,U > =T extends [inferF , ...inferRest ]?F extendsU ? true :Includes <Rest ,U >: false;