gpt4 book ai didi

Typescript:根据预期的返回类型约束函数泛型类型

转载 作者:行者123 更新时间:2023-12-04 03:39:12 24 4
gpt4 key购买 nike

我希望修复 addRandomValue 的输入函数,以便 Typescript 编译器不允许下面的调用,因为 baz不在 FooBar 中.

type WithRandomNumber<T> = T & { randomValue: number; };

function addRandomValue<T>(inputObj: T): WithRandomNumber<T> {
return {
...inputObj,
randomValue: Math.random(),
};
}

interface FooBar {
foo: string;
bar: number;
};

const resultObj: WithRandomNumber<FooBar> = addRandomValue({
foo: 'hello',
bar: 100,
baz: true,
});

也就是说,我想约束泛型 TaddRandomValue (因此是 inputObj 的类型),所以如果预期的返回类型是 WithRandomNumber<Foobar> (因为这是我们将返回值分配给的变量类型),然后 T必须等于 FooBar .

最佳答案

您不能强制编译器拒绝基于 LH 类型声明的赋值,您必须在调用函数时传递泛型参数:

type WithRandomNumber<T> = T & { randomValue: number; };

function addRandomValue<T>(inputObj: T): WithRandomNumber<T> {
return {
...inputObj,
randomValue: Math.random(),
};
}

interface FooBar {
foo: string;
bar: number;
};

const resultObj = addRandomValue<FooBar>({
foo: 'hello',
bar: 100,
baz: true,
});

问题不在于编译器不够智能,它与根据规范评估 Javascript 的方式有关。由于您没有在调用站点传递通用参数,它会推断类型 {foo: string bar: number, baz: boolean } 并评估它分配的 RH 表达式 then使用您声明的类型将结果发送给 LH var。因为 TS 是结构类型的,所以它确实是一个有效的分配,因为它具有 FooBar 所需的所有属性:

const foo = {
foo: 'hello',
bar: 100,
baz: true,
};

const bar: FooBar = foo;

Playground

关于Typescript:根据预期的返回类型约束函数泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66339317/

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