用ts封装了函数, 如何在执行后让输入参数推导到类型

function getType(input: unknown): string {
    const type = typeof input;
    if ('object' === type) {
        if (isArray(input)) {
            return 'array';
        } else if (null === input) {
            return 'null';
        } else {
            return 'object';
        }
    } else {
        return type;
    }
}

当我用getType的时候, input的值我想要能被推导出

if('string' === getType(input)){
    input.substring(0,1) // 报错, input是unknown
}
阅读 2.1k
2 个回答

我的TS也不太熟练,大概会写成这样,新增一个isType的函数

type ObjectType<T> = {
  string: string
  number: number
  bigint: bigint
  boolean: boolean
  symbol: symbol
  undefined: undefined
  object: object
  function: Function
  null: null
  array: T[]
}

function isType<T, K extends keyof ObjectType<T>>(
  input: unknown,
  t: K
): input is ObjectType<T>[K] {
  return getType(input) === t
}

这样的话可以通过isType来判断

const input = {}
if(isType(input, 'string')) {
  input.substring(0, 1)
  // input.forEach 报错
}
const type = (input: any) => {
    if (typeof input === 'object') {
        if (Array.isArray(input)) {
            return 'array';
        }
    }
    return typeof input;
}

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题