gpt4 book ai didi

typescript - 为什么在用作函数参数之前需要将子类型分配给变量?

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:21 25 4
gpt4 key购买 nike

我正在学习子类型并且想知道为什么这里给出一个例子 https://www.typescriptlang.org/docs/handbook/type-compatibility.html编译,但是当我将子类型作为参数直接传递给函数时,它不编译。

这是来自 typescriptlang.org 的原始代码

interface Named {
name: string;
}

let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: "Alice", location: "Seattle" };


function greet(n: Named) {
console.log("Hello, " + n.name);
}
greet(y); // OK

编译正常。但是这个版本,其中子类型没有分配给 y,失败了。

interface Named {
name: string;
}

let x: Named;

function greet(n: Named) {
console.log("Hello, " + n.name);
}
greet({ name: "Alice", location: "Seattle" }); // NOT OK

我得到错误:

'{ name: string; 类型的参数位置:字符串; }' 不可分配给类型为“已命名”的参数。对象字面量只能指定已知属性,并且“位置”不存在于类型“命名”中。

为什么子类型 { name: "Alice", location: "Seattle"} 必须先赋值给一个变量?

最佳答案

这是因为当您在需要特定类型的地方使用"new"对象字面量(意味着尚未分配给变量的字面量)时,通常添加错误类型中未提及的属性。所以这被标记为错误 excess property checking .这是少数几个将类型视为“封闭”或 "exact" 的地方之一。与“开放”相反。

如果您不想进行额外的属性检查,则有一些变通方法。一种是添加一个 index signaturen 参数的类型,以便接受所有额外的属性:

function greet(n: Named & { [x: string]: unknown }) {
console.log("Hello, " + n.name);
}
greet({ name: "Alice", location: "Seattle" }); // okay

或者,如果您通常想要这样的检查,但只想用那个特定的对象文字调用 greet(),您可以使用 type assertion避免中间变量:

greet({ name: "Alice", location: "Seattle" } as Named); // okay

这取决于你。好的,希望有所帮助;祝你好运!

关于typescript - 为什么在用作函数参数之前需要将子类型分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56007522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com