1

Code below,the parameter gender is enum type,the value must be one of ["male","female"],but I want to use it simply like this judgeGender("male"),how can I make it?

function judgeGender(gender){
    //......
}
sdgluck
  • 24,894
  • 8
  • 75
  • 90
codelegant
  • 583
  • 2
  • 6
  • 19

3 Answers3

1

What you could do is accept a String and check that it exists in the Enum, like so:

enum Gender {Male, Female};

function validGender(c: String) {
    if(enumHasValue(Gender, c)) {
        document.write(`valid gender: ${c}`);
    } else {
        document.write(`invalid gender: ${c}`);
    }
}

function enumHasValue(e, v) {
    for (var enumMember in e) {
        if (enumMember === v) {
            return true;
        }
    }
    return false;
}

validGender("Female"); // => "valid gender: Female"
document.write("<br/>");
validGender("Alien"); // => "invalid gender: Alien"

Try this example out in the TypeScript Playground (copy and paste it in and press Run).

sdgluck
  • 24,894
  • 8
  • 75
  • 90
  • Your suggestion is very helpfull,thanks for your answer :) – codelegant Sep 17 '15 at 12:23
  • If I wanna to make a type check to the parameter `e` of the function `enumHasValue`,just like `function enumHasValue(e:??,v:string)`,how to make it? – codelegant Sep 19 '15 at 00:41
  • [Take a look at this question](https://stackoverflow.com/questions/30774874/enum-as-parameter-in-typescript). – sdgluck Sep 19 '15 at 07:40
1

You can create a function to parse the gender parameter, like this:

function parseGender(value : Gender | number | string) {
  var gender;
  if (value === Number(value)) {
    gender = <Gender>value;
  }
  else if (value === String(value)) {
    if (<string>value in Gender) {
      gender = Gender[value];
    }
  }

  if (!gender) throw new TypeError("The parameter gender is incorrect");
  return gender;
}

And then you can use it inside your function:

function judgeGender(gender : Gender | number | string) {
  var g = parseGender(gender);

  // do whatever you want with g
}
Buzinas
  • 11,597
  • 2
  • 36
  • 58
  • Wow,it's a neat solution,but as your function: `parseGender(0)=>0;parseGender("male")=>0` ,then I change `gender = Gender[value];` to `gender = value;`;so `parseGender(0)=>0;parseGender("male")=>"male"`. Did I do something wrong? – codelegant Sep 19 '15 at 15:07
1

You can specify which values your function can receive.

type Male = "male";
type Female = "female";

enum Gender {
    Male = Male,
    Female = Female
}

function judgeGender(gender: Gender | Male | Female) {
    //......
}

judgeGender(Gender.Male);
judgeGender("male");
Rodris
  • 2,603
  • 1
  • 17
  • 25