gpt4 book ai didi

typescript - TypeScript 中的非破坏性类型断言

转载 作者:行者123 更新时间:2023-12-05 07:12:52 30 4
gpt4 key购买 nike

我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。

让我们考虑一个类型Named,它保证有一个名字。

type Named = {
name: string
};

使用类型注释会为用于定义常量 cat1 的文字中的额外字段 born 创建错误。

const cat1: Named = {
name: 'Findus',
born: 1984, // this is an error
};
const name1 = cat1.name;
const born1 = cat1.born; // this is an error

通过使用类型转换,我可以定义 const cat2 但它会丢失字段 born 的类型信息,这会在稍后尝试访问该字段时产生问题。

const cat2 = {
name: 'Findus',
born: 1984,
} as Named;
const name2 = cat2.name;
const born2 = cat2.born; // this is an error

解决该问题的一种方法是在定义 const cat3 时使用 IIFE 对文字进行类型检查。

const cat3 = (<C extends Named>(c: C) => c)({
name: 'Findus',
born: 1984,
});
const name3 = cat3.name;
const born3 = cat3.born;

这是执行约束的预期方式,还是有更好的替代方式来编写兼容代码?

最佳答案

简单的说你的类型是一条记录,需要一个参数name

interface Named extends Record<string, any> {
name: string
}

或者你可以使用这样的东西

type Named<T> = T & {
name: string
}


const a: Named<{ surname: string } > = {
name: 'hello',
surname: 'world'
};

关于typescript - TypeScript 中的非破坏性类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298695/

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