2014-09-10 40 views
1

在Typescript中重载函数具有意想不到的行为。是函数重载中的返回类型签名没用吗?

看看函数重载example,返回值签名是函数重载的一部分。但是,返回类型似乎完全被忽略。 Typescript没有必要“挑选”正确的函数参数签名,而最让我困扰的是,它不用于检查正确的返回值。

如果卡的返回值从数字更改为字符串,Typescript不会给出任何警告。

function pickCard(x: {suit: string; card: number; }[]): number; 
function pickCard(x: number): {suit: string; card: number; }; 
function pickCard(x): any { 
    // Check to see if we're working with an object/array 
    // if so, they gave us the deck and we'll pick the card 
    if (typeof x == "object") { 
    var pickedCard = Math.floor(Math.random() * x.length); 
    return pickedCard; 
    } 
    // Otherwise just let them pick the card 
    else if (typeof x == "number") { 
    var pickedSuit = Math.floor(x/13); 
    return { suit: suits[pickedSuit], card: x % 13 }; // <-- change to card: '13' 
    } 
} 

我的问题是:我会正确地解释过载机构,所以提供的是一个返回值的签名不是必需的,或者这一个错误?

+0

至少在呼叫方检查过吗? (如果你打电话给第一个超载,当你把结果看作是数字以外的东西时它会发出cro)声) – Thilo 2014-09-10 10:14:51

+0

当pickcard被调用'15'(字符串)而不是15(数字)时,它会发出抱怨。如果'返回pickCard'改为'return'someString''它不会抱怨。 – donnut 2014-09-10 10:26:04

+0

不,我的意思是,根据选择正确的过载,来电方是否得到适当的返回值类型推断?根据@史蒂芬芬顿的回答,它的确如此。所以你在这里有一些价值,即使它没有完全检查函数的实现,它也检查调用代码。 – Thilo 2014-09-10 11:01:31

回答

1

当我打电话给你的功能,我得到以下类型的返回:

// a is number 
var a = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b = pickCard(1); 

这节省了我不必手动指定:

// a is number 
var a: number = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b: {suit: string; card: number; } = pickCard(1); 

如果你让他们“错误你会确实会得到有关类型的错误:

// a is number 
var a: {suit: string; card: number; } = pickCard([{ suit: 'hearts', card: 1 }]); 

// b is {suit: string; card: number; } 
var b: number = pickCard(1); 

所以超载确实是pi根据您传递的参数加载 - 并根据所选的过载调整返回类型。

View this example on the TypeScript Playground

+0

如果pickCard没有返回一个数字而是一个字符串(例如,由于编程错误),Typescript不会抱怨。 (例如https://gist.github.com/donnut/7a99207254d23de08ecb)。 'a'将是'notANumber'而不是2。 – donnut 2014-09-10 10:51:01

+0

@donut。但是这将是该函数实现中的编程错误。你确实需要对调用该函数的代码进行类型检查。至少是这样。 – Thilo 2014-09-10 10:59:24

+0

你说得对。对于我来说忘记了Typescript会进行编译时类型检查而不是运行时。如果像这样编程错误也会被捕获,那将会很好。 – donnut 2014-09-10 11:25:34