typescript 编写一个add函数的脚本,参数可以为null,并使用条件类型声明返回类型

rvpgvaaj  于 2023-01-03  发布在  TypeScript
关注(0)|答案(2)|浏览(150)

我想写一个add函数
当参数都为空时,则返回空
当其中一个参数为空时,则返回另一个参数
当参数都是数字时,则返回它们的和
运动场

function add<A extends number | null, B extends number | null>(a: A, b: B): 
  A extends null
    ? B extends null
      ? null
      : B
    : B extends null
      ? A 
      : number {
    if (a == null) {
        if (b == null) { 
            return null // Type 'null' is not assignable to type 'A extends null ? B extends null ? null : B : B extends null ? A : number'.
        } else {
            return b
        }
    } else {
        if (b == null) { 
            return a
        } else {
            return a + b
        }
    }
}

const a = add(1 , 333) // number
const b = add(1 , null) // 1
const c = add(null , 2) // 2
const d = add(null , null) // null

为什么编译器会这样抱怨?代码和返回类型声明几乎是一样的。

oyt4ldly

oyt4ldly1#

我只使用重载:

function add(a: number, b: number): number;
function add<A extends number>(a: A, b: null): A;
function add<B extends number>(a: null, b: B): B;
function add(a: null, b: null): null;
function add(a: number | null, b: number | null) {
    return a === null && b === null ?  null : (a ?? 0) + (b ?? 0);
}

请注意,重载不对实现进行类型检查。
Playground

62o28rlo

62o28rlo2#

怎么会这样?

function add<A extends number | null, B extends number | null>(a: A, b: B): number | null {
      if (a == null) {
        if (b == null) {
          return null;
        } else {
          return b as NonNullable<B>;
        }
      } else {
        if (b == null) {
          return a as NonNullable<A>;
        } else {
          return a + b;
        }
      }
    }

相关问题