gpt4 book ai didi

TypeScript 条件通用接口(interface)作为参数(数组或对象,基于 bool 值)

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:15 26 4
gpt4 key购买 nike

我有一个函数应该能够接收两个相似的类型作为参数。取决于如果 props.multitruefalse .

问题是它仍然允许我通过 value = []multi = false .我怎样才能摆脱这个?

interface PropsSingle<T> {
value: T,
multi: false
}

interface PropsMulti<T> {
value: T[],
multi: true
}

function foo<T>(props: PropsSingle<T> | PropsMulti<T>) {
if(props.multi) {
let arr = props.value // type detection works fine
} else {
let obj = props.value // type detection works fine
}
}

foo({multi: true, value: []}) // works as expected
foo({multi: true, value: {}}) // throws error as expected
foo({multi: false, value: {}}) // works as expected
foo({multi: false, value: []}) // THIS SHOULD THROW AN ERROR

我已经试过了foo<T extends object>(...)foo<T extends {[key: string]: any}>(...)

我找到的唯一一种解决方案/解决方法是:

interface PropsSingle<T> {
value: T extends any[] ? never : T,
multi: false
}

但我觉得这很奇怪。

为什么我不能限制 function foo 的类型?

最佳答案

原因很简单,没有什么可以阻止 PropsSingle 中的 T 成为 any[]。并且没有简单的方法让 typescript 知道泛型参数不能扩展给定的类型,我们只能指定 T 扩展的内容。

您的解决方案应该可行,我通常在函数上添加约束并使用字符串文字类型在处理此类场景时提供更具启发性的错误消息:

interface PropsSingle<T> {
value: T,
multi: false
}

interface PropsMulti<T> {
value: T[],
multi: true
}

type ErrorIf<T, U, TError> = T extends U ? TError : {}

function foo<T>(props: (PropsSingle<T> & ErrorIf<T, any[], "Argument to PropsSingle can't be []")| PropsMulti<T>) {
if(props.multi) {
let arr = props.value // type detection works fine
} else {
let obj = props.value // type detection works fine
}
}

foo({multi: true, value: []}) // works as expected
foo({multi: true, value: {}}) // throws error as expected
foo({multi: false, value: {}}) // works as expected
foo({multi: false, value: []}) // Error Type '{ multi: false; value: undefined[]; }' is not assignable to type '"Argument to PropsSingle can't be []"'.

关于TypeScript 条件通用接口(interface)作为参数(数组或对象,基于 bool 值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51553632/

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