typescript类型定义问题?

举例如下:

const resultIs = (input: any, target?: any) => {
    let result: any = ...;

    // ...
    // 对input的处理

    if (target) {
        return result === target;
    }
    return resultIs;
}

假如我要对input进行处理,处理得到的结果是result,如果传了期望值target,则返回一个boolean值,表示result是不是符合期望的值target,如果没传target,则直接返回result

问题:怎么定义resultIs的参数和返回类型,才能明确如果target传了,返回的值固定为boolean类型,如果没有传,则input为什么类型,result即为什么类型?
=============================更新============================
以实际例子说吧:

type AllType = 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function' | 'array' | 'null' | 'nan'

const typeIs = <M>(input: M, target?: AllType): boolean | AllType => {
    if (Array.isArray(input)) {
        return !target ? 'array' : target === 'array';
    } else if (input === null) {
        return !target ? 'null' : target === 'null';
    } else if (typeof input === 'number' && isNaN(input)) {
        return !target ? 'nan' : target === 'nan';
    }

    return !target ? typeof input : target === typeof input;
}
const aa = 'asdsad';

typeIs(aa, 'string')

typeIs(aa)

image.png

image.png

阅读 1.9k
3 个回答
function resultIs<T>(input: T, target: T): boolean
function resultIs<T>(input: T): T
function resultIs<T>(input: T, target?: T) {
    if (target) {
        return input === target
    }
    return input
}

类型是类型,声明是声明。(提供的demo在ts4.5.4版本的playground里语法是错的哈,范型只能用在类型了)
期望是resultIs函数的返回结果能够根据参数列表的具体情况进行推测,那么这个推测可以认为是map关系,或者说一一对应关系。参数列表有两种形式,对应两种结果类型。JavaScript不支持重载,只有靠类型表达这种一一对应关系。有一说一只能像楼上的写法来明确告知这种关系。
const typeIs声明了一个变量,并将一个匿名箭头函数赋值给该变量,所以要么通过函数声明本身让系统推断返回类型,否则写明了返回类型系统就不会推断了。

用重载,这个就符合你的要求。跟 @liuye1296 的回答差不多,只是他的返回类型没写对。

captured-1.gif

type AllType = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "array" | "null" | "nan"

function typeIs<T>(input: T, target: AllType): boolean
function typeIs<T>(input: T): AllType
function typeIs<T>(input: T, target?: AllType) {
    if (Array.isArray(input)) {
        return !target ? "array" : target === "array";
    } else if (input === null) {
        return !target ? "null" : target === "null";
    } else if (typeof input === "number" && isNaN(input)) {
        return !target ? "nan" : target === "nan";
    }

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