感谢
- 我承认,使用此模板的问题可能会在维护者的酌情决定下不经进一步解释而关闭。
评论
嗨,伙计们,如果我错了,请纠正我,但我认为satisfies关键字的文档有一个错误
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];
const palette: Record<Colors, string | RGB> = {
red: [255, 0, 0],
green: "#00ff00",
bleu: [0, 0, 255]
// ~~~~ The typo is now correctly detected
};
// But we now have an undesirable error here - 'palette.red' "could" be a string.
const redComponent = palette.red.at(0);
因为值是字符串和数组的并集,所以palette.red.at(0)不会抛出错误,因为at方法同时存在于这两种类型中。
干杯 :).
7条答案
按热度按时间webghufk1#
关键不是缺少
at()
方法,而是它可能会返回一个string
。这里没有错误,只是个误解。whlutmcx2#
在TypeScript中,
palette.red.at(0)
不会报错,因为TypeScript可以根据属性访问正确推断出类型。cnwbcb6i3#
我认为OP的观点是,文档中说
palette.red.at(0)
存在一个"不理想的错误",但实际上没有错误。也许"错误"这个词用错了,或者文档应该使用像map()
这样的仅涉及数组的方法,而不是at()
之类的方法。无论如何,我认为文档中的错误应该归类在https://github.com/microsoft/TypeScript-Website/issues。
zbsbpyhn4#
文档中没有错误,只是在提到"错误"时措辞不当。使用
map
并不能展示他们正在制作的示例。使用类型注解时,at()
的返回类型是string | number
,但当使用satisfies
时,返回类型是number
。rdrgkggo5#
我认为这个例子是无意中针对一个pre-
String#at
目标编写的。nwlqm0z16#
我相信文档是不正确的或者误导性的。如果需要,我可以向 https://github.com/microsoft/TypeScript-Website 发送 PR。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#the-satisfies-operator 应该像这样:
satisfies
运算符TypeScript 开发者经常面临一个两难的问题:我们想要确保某个表达式 匹配 某种类型,但同时也希望保留该表达式 最具体的 类型以供推断使用。
例如:
请注意我们写了
bleu
,尽管我们可能本应该写blue
。我们可以通过在
palette
上使用类型注解来尝试捕获bleu
这个拼写错误,但我们会丢失关于每个属性的信息。新的
satisfies
运算符让我们验证表达式的类型是否与某种类型匹配,而不改变该表达式的结果类型。作为示例,我们可以使用
satisfies
来验证palette
的所有属性都与string | number[]
兼容:satisfies
可以用于捕获许多可能的错误。例如...
b1zrtrql7#
看起来不错,请继续进行PR。谢谢!