gpt4 book ai didi

javascript - 从值位置流 javascript 泛型类型 "Cannot reference type ` CustomType`[1]。”

转载 作者:行者123 更新时间:2023-11-30 20:36:53 25 4
gpt4 key购买 nike

我正在尝试调用一个异步函数并指定一个自定义类型(我们称之为“CustomType”)。我在该类型中指定了一些随机属性,只是为了理解它是来自数据库的东西(内容可能会根据检索到的项目而有所不同,对于存储在 NoSql 中的每种文件,我都有许多不同的“CustomType”数据库)。

这是可使用 https://flow.org/try 测试的代码

/* @flow */

// Type that would be returned in the case of usage of "mySpecificCallFunc(): Promise<Array<CustomType>>" defined below
declare type CustomType = {
prop1: boolean,
prop2: string,
prop3: Date
}

// Generic function that does the hard work
async function asyncFunc<T>(dateStart: Date, otherArgument: string):Promise<Array<T>>
{
let r:Array<T> = [] // do a call that returns an array that must be of a specific type
return r
}

// High level function that would send parameters to the generic function "asyncFunc"
async function mySpecificCallFunc(): Promise<Array<CustomType>>
{
let r = await asyncFunc<CustomType>(new Date(), 'test')
return []
}

无法从值位置引用类型 CustomType [1]。

Flow 不希望使用自定义类型。

在 C# 中,这种通用用法是完全可以接受的,所以我不明白它为什么会提示?

它给出以下错误:

20:   let r = await asyncFunc<CustomType>(new Date(), 'test')
^ Cannot compare boolean [1] to string [2].
References:
20: let r = await asyncFunc<CustomType>(new Date(), 'test')
^ [1]
20: let r = await asyncFunc<CustomType>(new Date(), 'test')
^ [2]
20: let r = await asyncFunc<CustomType>(new Date(), 'test')
^ Cannot reference type `CustomType` [1] from a value position.
References:
3: declare type CustomType = {
^ [1]

更新:当前“CustomType”和请求参数之间没有链接。在现实世界中,它看起来像这样:

call: DbRetrieve('type1', param1, param2)
return: [{ _type: 'type1', prop1: true, prop2:'b' }] // an array containing <CustomType> objects

如您所见,无法根据函数 asyncFunc 的参数定义“形状”,因为参数并不总是链接到返回对象的属性。

这是一个类似 ORM 的调用,我只是希望能够在不进行一些“强制转换”的情况下指定类型,但我可能走错了路,因为无法从用法中推断出类型...

最佳答案

  1. 您不能在调用时直接指定类型。
  2. 你的 CustomType是一个对象,但在代码中你期望一个 boolean

因此,首先您需要在传入数据和传出数据之间建立链接:

async function asyncFunc<T>(p: T):Promise<T[]> {
return []
}

<T>在函数声明中就像声明一个变量一样,但是p: T:Promise<T[]>建立依赖

其次,您需要制作 T通过 async function asyncFunc<T: CustomType>... 缩小一点.并更改您的 type CustomType = boolean;

之后,您只需调用await asyncFunc(true);无需任何打字。

更新:
你试图指定函数应该返回的类型,只是在函数调用时——这不是正确的方法,不在流程上,也不在 JS 上。函数结果类型当然应该在函数声明点上声明——它可以是多种类型组合的单一类型(type0 | type)。

通用类型用于在参数和结果之间建立关系。因此,例如,您可以创建一个获取参数并返回相同类型值数组的函数,例如 function doSmt<T>(a: T): T[] {return [a];}

我不确定你到底想做什么,但也许你需要这样的东西:

type CustomType<A, B> = {
prop0: A,
prop1: B,
}
function asyncFunc<C: string, D: number>(foo: C, bar: D): CustomType<C, D> {
// some actions
}

关于javascript - 从值位置流 javascript 泛型类型 "Cannot reference type ` CustomType`[1]。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733620/

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