2017-04-04 66 views
3
function myFunc({ param1 }: {             
    param1: number;                
}) {                   
    // param1 is marked as mandatory in the definition, but we can bypass that 
}                    

const mismatchedFunc: ({}) => void = myFunc;         

mismatchedFunc({}); // No compile-time error 

我猜测,对于这种现象的原因,从打字稿的结构型性质茎函数调用使用结构类型和变量重新分配到旁路类型检查,在{ param1: number }结构“适合“{}与“命名参数”

然而,这是不是不受欢迎的行为(在这种情况下,或类的情况下),因为它在很大程度上绕过了TypeScript提供的类型检查?

这应该作为一个错误提交吗?

编辑1

由于@shusson指出,行为(如V2.X)的预期(由于权衡),即使它是不可取的。

有关该问题根源的最相关讨论,请参阅this GitHub issuefollow-up proposal以尝试解决该问题。

回答

2

有两件事情怎么回事:

  1. structural typing

    为打字稿的结构类型系统的基本规则是,x是其中y兼容如果y至少有相同的成员为x。

  2. bivariant function parameters

    当比较类型的函数的参数,分配成功如果源参数是分配给所述目标参数,或者反之亦然

例如:

type t1 = { param1: number }; 
type t2 = { }; 

let f1 = (a: t1) => {}; 

let f2: (a: t2) => void = f1; // bivariant assignment 

let x: t1 = { param1: 1 }; 
let y: t2 = {}; 

y = x; // because of this, f1 is assignable to f2 through bivariant assignment 
x = y; // compile error 

f1(x); 
f1(y); // compile error 

f2(x); 
f2(y); 
+0

所以双变量函数参数是一种不受欢迎的行为,但这是一种预期并且是权衡的结果。那是对的吗? – pleasedesktop

+0

是的,这是我的理解。 TypeScript有他们的文档称为“不健全”的行为,这是不可避免的,但仔细考虑。我认为这些问题大部分都是由于TypeScript与JavaScript结合而引起的(在我看来这是一件好事)。 – shusson