Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Typescript introduction(ⅠII) #20

Closed
headwindz opened this issue Apr 5, 2019 · 0 comments
Closed

Typescript introduction(ⅠII) #20

headwindz opened this issue Apr 5, 2019 · 0 comments

Comments

@headwindz
Copy link
Owner

Functions

Function Types

Function types can be defined in three ways.

Method Signature

// function declaration
function addWithMethodSignature(x: number, y: number): number {
  // method signature
  return x + y;
}

// function expression
let anotherAddWithMethodSignature = function(x: number, y: number): number { 
  // method signature
  return x + y;
}; 

Function type literal

A function type literal specifies the type parameters, regular parameters, and return type of a call signature.

let addWithFuncLiteral: (x: number, y: number) => number = function(x, y) {
  return x + y;
};

Object literal

An object type containing one or more call signatures is said to be a function type.

let addWithObjLiteral: { (x: number, y: number) : number } = function(x, y) {
  return x + y;
};

Function type literal vs Object literal

  • Function types may be written using function type literals or by including call signatures in object type literals. i.e.
< T1, T2, ... > ( p1, p2, ... ) => R

is exactly equivalent to the object type literal

{ < T1, T2, ... > ( p1, p2, ... ) : R }
  • To differentiate function types defined with object literal, check to see whether the object literal/interface contains a call signature
interface A { // an object with a property called `log` which is function type
  log(num: number): number; // a property
}

let obj: A = {
  log(n) {
    return n;
  }
}

interface A1 { // a function type.
  (num: number): number // call signature
}

let func: A1 = (n: number) => n

Optional parameters

Optional property can be marked with ? following the parameter name. E.g.

function parseInt(s: string, radix?: number): number {
  // ...
}

let result1 = parseInt('3'); // ok 
let result2 = parseInt('3', 2);  // ok
let result3 = parseInt('3', 2 , 'too many'); // ok

Overloads

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
  if (typeof x == "object") {
    let pickedCard = Math.floor(Math.random() * x.length);
    return pickedCard;
  }
  else if (typeof x == "number") {
    let pickedSuit = Math.floor(x / 13);
    return { suit: suits[pickedSuit], card: x % 13 };
  }
}

let myDeck = [{
  suit: "diamonds", card: 2
}, {
  suit: "spades", card: 10
}, {
  suit: "hearts", card: 4
}];

let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

Notice

  • If you want to follow the latest news/articles for the series of my blogs, Please 「Watch」to Subscribe.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant