gpt4 book ai didi

TypeScript 泛型仅使用默认值

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

我正在尝试将默认值应用于泛型。但是只要没有提供泛型,泛型就会默认为给定参数的值。我想防止这种情况发生。这是一个非常简单的例子:

type Data = Record<string, any>

const computeData = <D extends Data = {}>(input: D): D => {
// Does some stuff to input
return input;
}

const res = computeData<{ name: string }>({ name: 'john' })

在这种情况下,“res”的类型如预期的那样是 { name: string } 。但是,如果未提供泛型,我需要它默认为 {},这是作为泛型默认值给出的类型。

const computeData = <D extends Data = {}>(input: D): D => {
// Does some stuff to input
return input;
}

const res = computeData({ name: 'john' })

我已经简化了这个例子的代码。我知道在这个例子的上下文中这是毫无意义的。

编辑:实际用例是一个网络模拟器,它允许用户将对象添加到模拟 graphql 请求中。我想让他们选择提供解析器类型。但是,如果他们不提供从传入的初始数据推断出的类型 - 我想避免这种情况。

定义泛型的类 enter image description here

类型错误,因为对构造函数的初始调用推断泛型的类型 enter image description here

这是有效的,因为在实例化类时给出了显式类型 enter image description here

最佳答案

您可以通过使用另一个类型参数并过滤掉默认值来绕过类型推断。您甚至可以在不进行类型断言的情况下执行此操作。

示例代码

type Data = Record<string, any>

type NoInferData<DataType extends Data | void, InputType extends Data> = (
DataType extends void
// If it was void, there was no argument, so the type must be an empty object, or whatever you'd like
? Record<string, never>
// Otherwise it should match the explcitly added data type
: InputType
);

const computeData = <
// Type arugment for the type of Data you are providing
DataType extends Data | void = void,
// Type argument to store the inferred type of the input
// - If its void, return the default type, in this example it's an empty object
// - Otherwise, return the type of Data explicitly provided
InputType extends Data = DataType extends void ? Record<string, never> : DataType
>(input: NoInferData<DataType, InputType>): NoInferData<DataType, InputType> => {
// Does some stuff to input
return input;
}


// Allows expliclty marking the data type
const explicitData = computeData<{ name: string }>({ name: 'john' })

// Doesn't allow data that doesn't match the explcit data type
const explicitDataError = computeData<{ pizza: string }>({ name: 'john' })

// Doesn't allow data that doesn't meet the default (no inferring)
const implictEmptyObjectError = computeData({ name: 'john' })

// Allows the default type of the empty object
const implictEmptyObject = computeData({})

TypeScript Playground

关于TypeScript 泛型仅使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67824800/

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