Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
362 views
in Technique[技术] by (71.8m points)

typescript - Function overloading is not implemented

A request requests different interfaces according to different input values, and returns different return values. code show as below:

enum E {
  A,
  B,
  C,
}
interface Fn {
  (arg: E.A): Number;
  (arg: E.B): String;
  (arg: E.C): null;
}
const fn: Fn = (arg: E) => {
  switch (arg) {
    case E.A:
      return 1;
    case E.B:
      return '1';
    default:
      return null;
  }
};

It can be inferred correctly when used, but getSelectList reports an error message:

const fn: Fn
'fn' is declared but its value is never read.ts(6133)
Type '(arg: E) => 1 | "1" | null' is not assignable to type 'Fn'.
  Type 'string | number | null' is not assignable to type 'Number'.
    Type 'null' is not assignable to type 'Number'.ts(2322)

seem like thishttps://github.com/microsoft/TypeScript/issues/33014

enum E {
  A,
  B,
  C,
}
type FF<A extends E> = A extends E.A
  ? Number
  : A extends E.B
    ? String
    : null;

const fn = <A extends E>(arg: A): FF<A> => {
  switch (arg) {
    case E.A:
// error: Type '1' is not assignable to type 'FF<A>'
      return 1;
    case E.B:
      return '1';
    default:
      return null;
  }
};

fn(E.A);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

There is a workaround:

enum E {
    A,
    B,
    C,
}

function fn(arg: E.A): number;
function fn(arg: E.B): string;
function fn(arg: E.C): null;
function fn(arg: E) {
    switch (arg) {
        case E.A:
            return 1 as number;
        case E.B:
            return '1' as string;
        default:
            return null;
    }
}
const result = fn(E.A) // number
const result2 = fn(E.B) // string
const result3 = fn(E.C) // null

P.S. Try to avoid constructor types like String | NUmber, use primitives as string | number


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...