gpt4 book ai didi

javascript - Flowtype 扩展对象类型

转载 作者:搜寻专家 更新时间:2023-11-01 04:34:43 26 4
gpt4 key购买 nike

作为 JavaScript 开发人员,我是类型检查的新手,我很难理解为什么这个简单的代码不起作用:

type Animal = {
id: number,
name: string,
type: 'dog' | 'cat'
};

type Dog = {
id: number,
name: string,
type: 'dog',
color: string
};

function printAnimal(animal: Animal): string {
return `${animal.type}: ${animal.name}`;
}

const buddy: Dog = {
id: 1,
name: 'Buddy',
type: 'dog',
color: 'black'
}

printAnimal(buddy);

我在这里试图实现的是有一个接受接口(interface)的方法。然而,这给了我错误: Cannot call 'printAnimal' with 'buddy' bound to 'animal because string literal 'dog' [1] is incompatible with string literal 'cat' [2] in property 'type'..

我尝试过的:

  1. interface Animal {//...} - 不起作用。
  2. buddy 中删除输入 - 它有效,但我不满意。有时我确实想要更严格的类型(所以我知道我正在处理狗而不是猫)但仍然使用接受任何动物的通用方法。
  3. 我尝试更改 type: 'dog' | 'cat'type: string - 不起作用。我希望 'dog' 字符串是一般 string 类型的子类型,但事实并非如此。另一方面,即使它有效,也不够 - 有时我知道我的应用程序只接受狗和猫,不接受任何其他动物。

感谢阅读,希望能得到大家的帮助!这是实时版本:Try Flow - live example

最佳答案

您必须使 Animal 类型成为一个接口(interface),因为它将您的类型实现描述为“父级”。如果您通过 联合 扩展您的 Dog 类型来强制执行它,那将是有意义的,因为这就是使用类型来实现更强大的类型检查的意义所在。

可以这样写:

/* @flow */

interface Animal {
id: number,
name: string,
type: 'dog' | 'cat'
};

type Dog = Animal & {
type: 'dog',
color: string
};

function printAnimal(animal: Animal): string {
return `${animal.type}: ${animal.name}`;
}

const buddy: Dog = {
id: 1,
name: 'Buddy',
type: 'dog',
color: 'black'
}

printAnimal(buddy);

关于javascript - Flowtype 扩展对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53260023/

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