Typescript 如何为union类型参数提供默认值而不获取;可以使用约束的不同子类型“实例化”;

Typescript 如何为union类型参数提供默认值而不获取;可以使用约束的不同子类型“实例化”;,typescript,typescript-generics,Typescript,Typescript Generics,作为……的后续行动 在下面的示例中,是否有方法为valueProp提供默认值 type ValueType = 'value' | 'defaultValue' type Props<T extends ValueType> = Record<T, string> & { other: string } function props<T extends ValueType>(valueProp: T): Props<T> {

作为……的后续行动

在下面的示例中,是否有方法为
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
我大体上理解此错误(,),但仍然不总是知道解决此错误的最佳方法

有没有一个简单的方法来做我想做的事

似乎应该有一种简单的方法来提供默认值,但可能默认值与泛型类型约束的结合不太好

泛型类型的默认类型? 我试过这个:

function props<T extends ValueType = 'value'>(valueProp: T = 'value'): Props<T> {
  return {
    [valueProp]: 'value',
    other: 'other',
  } as Props<T>
}
类型断言? 我曾想过这样做,它可以编译,但仍然不能阻止
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"}
函数props(valueProp:T='value'作为T):props{
返回{
[valueProp]:“值”,
其他:'其他',
}作为道具
}
console.log(props())
//=>{value:“value”,其他:“other”}
更复杂的事? 我仍然希望有一个简单的解决方案,但如果没有,也许会有更复杂的解决方案

可能使用从类型映射到该类型默认值的映射表

为了获得灵感,也许有点像:

  • ?


根据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',
  }
}

使用我在回答中首先提出的重载方法好吧,我想重载毕竟有重要的用途!:)感谢您再次指出了简单的解决方案。顺便说一句,我之所以尝试避免函数重载,是因为这不是唯一一个基于参数的动态键——而且我担心,如果我必须使用重载枚举所有可能的参数组合,可能会导致组合爆炸。不过,我想我会等到遇到这个问题时再去担心。
props<'defaultValue'>()
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"}
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',
  }
}
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',
  }
}