TypeScript 文档中的错误

rlcwz9us  于 6个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(56)

感谢

  • 我承认,使用此模板的问题可能会在维护者的酌情决定下不经进一步解释而关闭。

评论

嗨,伙计们,如果我错了,请纠正我,但我认为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方法同时存在于这两种类型中
干杯 :).

webghufk

webghufk1#

关键不是缺少 at() 方法,而是它可能会返回一个 string。这里没有错误,只是个误解。

whlutmcx

whlutmcx2#

在TypeScript中,palette.red.at(0)不会报错,因为TypeScript可以根据属性访问正确推断出类型。

cnwbcb6i

cnwbcb6i3#

我认为OP的观点是,文档中说palette.red.at(0)存在一个"不理想的错误",但实际上没有错误。也许"错误"这个词用错了,或者文档应该使用像map()这样的仅涉及数组的方法,而不是at()之类的方法。

无论如何,我认为文档中的错误应该归类在https://github.com/microsoft/TypeScript-Website/issues

zbsbpyhn

zbsbpyhn4#

文档中没有错误,只是在提到"错误"时措辞不当。使用 map 并不能展示他们正在制作的示例。使用类型注解时,at() 的返回类型是 string | number ,但当使用 satisfies 时,返回类型是 number

rdrgkggo

rdrgkggo5#

我认为这个例子是无意中针对一个pre-String#at目标编写的。

nwlqm0z1

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 开发者经常面临一个两难的问题:我们想要确保某个表达式 匹配 某种类型,但同时也希望保留该表达式 最具体的 类型以供推断使用。
例如:

// Each property can be a string or an RGB tuple.
const palette = {
    red: [255, 0, 0],
    green: "#00ff00",
    bleu: [0, 0, 255]
//  ^^^^ sacrebleu - we've made a typo!
};

// We want to be able to use string methods on 'green'...
const greenNormalized = palette.green.toUpperCase();

请注意我们写了 bleu ,尽管我们可能本应该写 blue
我们可以通过在 palette 上使用类型注解来尝试捕获 bleu 这个拼写错误,但我们会丢失关于每个属性的信息。

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.greed' "could" be of type RGB and
// property 'toUpperCase' does not exist on type 'string | RGB'.
const greenNormalized = palette.green.toUpperCase();

新的 satisfies 运算符让我们验证表达式的类型是否与某种类型匹配,而不改变该表达式的结果类型。
作为示例,我们可以使用 satisfies 来验证 palette 的所有属性都与 string | number[] 兼容:

type Colors = "red" | "green" | "blue";

type RGB = [red: number, green: number, blue: number];

const palette = {
    red: [255, 0, 0],
    green: "#00ff00",
    bleu: [0, 0, 255]
//  ~~~~ The typo is now caught!
} satisfies Record<Colors, string | RGB>;

// toUpperCase() methode is still accessible!
const greenNormalized = palette.green.toUpperCase();

satisfies 可以用于捕获许多可能的错误。
例如...

b1zrtrql

b1zrtrql7#

看起来不错,请继续进行PR。谢谢!

相关问题