gpt4 book ai didi

typescript - 防止 TypeScript 在通过函数传递字符串文字类型时将其扩展为字符串类型

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

我们如何防止 TypeScript 将字符串文字类型扩展为字符串?

例如in the Playground

type PropertyName = 'Property1' | 'Property2';

type ObjectWithPropertyName =
{ Property1: string; } |
{ Property2: string; };

const obj1: ObjectWithPropertyName = {
['Property1']: 'works',
}

const prop: PropertyName = 'Property1';
const obj2: ObjectWithPropertyName = {
[prop]: 'works',
}

const func = (prop: PropertyName) => {
const obj: ObjectWithPropertyName = {
[prop]: "fails",
};
};

const funcToo = (prop: PropertyName) => {
const propInner: PropertyName = prop;
const obj: ObjectWithPropertyName = {
[propInner]: "fails",
};
};

在最后一种情况下,错误是这样的:

Property 'Property1' is missing in type '{ [x: string]: string; }' but required in type 'ObjectWithPropertyName'.

最佳答案

它适用于 const 示例的原因是 typescript 知道 prop 只能是 'Property1'。当您处理可以具有多个值中的任何一个的参数时, typescript 将推断出具有索引签名的类型。

例如,虽然不是特别有用,但这也有效,因为 prop 只能是 Property1:

const func = (prop: 'Property1') => {
const obj: ObjectWithPropertyName = {
[prop]: "fails",
} ;
};

最简单的解决方案是使用类型断言来强制为 obj 指定类型:

const func = (prop: PropertyName) => {
const obj = {
[prop]: "fails",
} as ObjectWithPropertyName;
};

根据您尝试执行的操作,您可能会考虑采用不同的方法,例如,我们可以捕获传入的实际常量并返回包含该键的任何内容的 Record:

const func = <T extends PropertyName>(prop: T) => {
const obj : Record<T, string> = {
[prop]: "ok",
};
return obj;
};
func('Property1').Property1

关于typescript - 防止 TypeScript 在通过函数传递字符串文字类型时将其扩展为字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622978/

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