挑战 - 每日系列(Algorithm + TypeChallenge)

94 阅读1分钟

算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀

算法

2618. 检查是否是类的对象实例

题意理解

判断 JavaScript 中,一个类是否是该对象的实例

思路

  • 可以使用 instanceof 来判断
  • 可以根据原型链的规则来判断
  • 需要考虑 nullundefined 两种情况

解题

原型链判断

const checkIfInstanceOf = function(obj, classFunction) {
    if (obj === undefined || obj === null || classFunction === null || classFunction === undefined) {
        return false
    }
    while(obj.__proto__ && obj.__proto__ !== classFunction.prototype) {
        obj = obj.__proto__
    }
    return obj.__proto__ === classFunction.prototype
}

instanceof 判断

// instanceof 
const checkIfInstanceOf = function(obj, classFunction) {
    if (obj === undefined || obj === null || !(classFunction instanceof Function)) {
        return false
    }
    return Object(obj) instanceof classFunction
}

TypeChallenge

实现类型 IsUnion<T>, 判断类型是否事联合类型

思路

  • 对于联合类型,可以利用分布式类型的特点进行遍历
  • 和输入类型对比,需要拷贝一份原类型
  • 要对 never 特殊处理

解题

type IsUnion<S, T = S> = IsNever<S> extends true 
    ? false : S extends S ? [T] extends [S] ? false : true : never