gpt4 book ai didi

TypeScript:具有一个必填字段的接口(interface)的通用类型

转载 作者:行者123 更新时间:2023-12-05 03:53:19 29 4
gpt4 key购买 nike

我想创建一个函数 f,它接受一个字符串,并创建一个对象,其中 key 是唯一的字段集。

我还希望函数对接口(interface) A 进行类型检查,以确保 key 字段是对象上唯一的 必需 字段. (会有其他可选字段)。

问题:

是否有可能表达类型 A 以便函数 f 有效——并且不会产生类型错误——并且仍然类型检查 A 使用时正确吗?

export function f<A extends { key: string }>(key: string): A {
return { key }; // This produces compile error TS2322: (see below)
}

// This be a few different interfaces, but they all have in common that
// the key-field is the only required field.
interface WithKey {
key: string;
ignoreMe?: string;
}

const result = f<WithKey>('myKey');

编译器错误:

TS2322: Type '{ key: string; }' is not assignable to type 'A'.   '{ key: string; }' is assignable to the constraint of type 'A', but 'A' could be instantiated with a different subtype of constraint '{ key: string; }'.

最佳答案

问题是你的声明说它接受一个类型,该类型必须有 stringkey 并且这个类型将被返回。

意思是如果我经过那里

{key: 1, requiredField: 5}

它返回与我的 requiredField 相同的类型。

但是 return { key } 的实现打破了这条语句,因为它不再返回 requiredField。这会导致 TS2322。

一个可能的解决方案 - 只需说出您返回的界面。

export function f(key: string): { key: string } { // <- return type
return { key };
}

interface WithKey {
key: string;
ignoreMe?: string;
}

const result: WithKey = f('myKey');

result.key; // works
result.ignoreMe // works (undefined)

关于TypeScript:具有一个必填字段的接口(interface)的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61755291/

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