TypeScript中的接口

3

我正在阅读Typescript手册,在接口章节中,我发现了一个问题:

interface LabelledValue {
  label: string;
}

function printLabel(labelledObj: LabelledValue) {
  console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);
printLabel需要一个带有label:string属性的对象,但我们传递的对象有另一个名为size的属性。这是可以的,因为编译器只检查至少存在并匹配所需类型的属性。
但是,当我以这种方式调用printLabel
printLabel({size: 10, label: "Size 10 Object"});

编译出现异常。为什么会这样?

你能包含这个异常吗? - Igor
1
如果你搜索错误信息(object literal may only specify known properties),你会找到答案:https://dev59.com/SlwZ5IYBdhLWcg3wIdR7 或者 https://dev59.com/Eo_ea4cB1Zd3GeqPRrBG - Nitzan Tomer
1个回答

4

文档已过时,存在问题需要修复

来自TypeScript的新特性页面:

TypeScript 1.6 强制执行更严格的对象字面量赋值检查,以便捕获多余或拼写错误的属性。具体而言,当将一个新的对象字面量分配给变量或作为非空目标类型的参数传递时,如果对象字面量指定了目标类型中不存在的属性,则会出现错误。

这个想法是将对象字面量作为选项集合进行传递,这是一种非常常见的模式。例如:

interface ConnectionOptions {
    tryHttps?: boolean;
    url?: string;
    username?: string;
    password?: string;
}

但是所有这些属性都是可选的。在1.6之前,我可以拼错其中任何一个,编译器永远不会捕获到这个错误:

declare function connect(options: ConnectionOptions);

// Notice the property given is 'tryHTTPS' instead of 'tryHttps'.
connect({ url: "stackoverflow.com", tryHTTPS: true });

你可以通过向赋值的类型添加类型断言来解决此问题:
printLabel({size: 10, label: "Size 10 Object"} as LabelledValue);
// or...
printLabel(<LabelledValue>{size: 10, label: "Size 10 Object"});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接