gpt4 book ai didi

typescript - 如何在不获取 "could be instantiated with a different subtype of constraint"的情况下为联合类型参数提供默认值

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

作为 my previous question 的后续...

有没有办法在以下示例中为 valueProp 提供默认值?

type ValueType = 'value' | 'defaultValue'

type Props<T extends ValueType> =
Record<T, string>
& { other: string }

function props<T extends ValueType>(valueProp: T): Props<T> {
return {
[valueProp]: 'value',
other: 'other',
} as Props<T>
}

let { defaultValue, other } = props('defaultValue') // ok
let { value } = props('value') // ok

Play

当我尝试这个时:
function props<T extends ValueType>(valueProp: T = 'value'): Props<T> {
return {
[valueProp]: 'value',
other: 'other',
} as Props<T>
}

,我收到此错误:
Type '"value"' is not assignable to type 'T'.
'"value"' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'ValueType'.

我总体上理解此错误( 1234 ),但仍不总是知道解决此错误的最佳方法。

有没有一种简单的方法可以做我想做的事情?

似乎应该有一种简单的方法来提供默认值,但也许默认值与泛型类型约束不能很好地混合?

泛型类型的默认类型?

我试过这个:
function props<T extends ValueType = 'value'>(valueProp: T = 'value'): Props<T> {
return {
[valueProp]: 'value',
other: 'other',
} as Props<T>
}

但当然得到了同样的错误,因为如果提供了特定的 defaultValue,T 仍然可能是 T:
props<'defaultValue'>()

类型断言?

我想到了这样做,它编译了,但仍然不能阻止 valueProp 不同意 T:
function props<T extends ValueType>(valueProp: T = 'value' as T): Props<T> {
return {
[valueProp]: 'value',
other: 'other',
} as Props<T>
}

console.log(props<'defaultValue'>())
// => {value: "value", other: "other"}

更复杂的东西?

我仍然希望有一个简单的解决方案,但如果没有,也许更复杂的东西会起作用?

也许使用从类型映射到该类型的默认值的映射表?

对于灵感,也许是这样的:
  • 'CustomEnum.Case' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'CustomEnum'
  • https://github.com/microsoft/TypeScript/issues/29528#issuecomment-456804257
    ?
  • 最佳答案

    根据 Titian Cernicova-Dragomir 的评论,我们可以非常简单地使用函数重载来做到这一点:

    type ValueType = 'value' | 'defaultValue'

    type Props<T extends ValueType> =
    Record<T, string>
    & { other: string }

    function props<T extends ValueType>(valueProp: T): Props<T>
    function props(): Props<'value'>
    function props(valueProp: ValueType | undefined = 'value') {
    return {
    [valueProp]: 'value',
    other: 'other',
    }
    }

    Play

    或者如果我们想移动 valueProp从位置参数到伪命名参数(使用对象解构):
    type PropsOptions<VT extends ValueType | undefined> = {
    valueProp?: VT
    }

    function props<VT extends ValueType>({valueProp}: PropsOptions<VT>): Props<VT>
    function props(): Props<'value'>
    function props({ valueProp = 'value' }: PropsOptions<ValueType | undefined> = {}) {
    return {
    [valueProp]: 'value',
    other: 'other',
    }
    }

    Play

    关于typescript - 如何在不获取 "could be instantiated with a different subtype of constraint"的情况下为联合类型参数提供默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58597842/

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