Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript部分<;T>;没有未定义的类型_Typescript_Generics_Partial - Fatal编程技术网

TypeScript部分<;T>;没有未定义的类型

TypeScript部分<;T>;没有未定义的类型,typescript,generics,partial,Typescript,Generics,Partial,如何创建一种-Partial类型,它不允许未定义的值 下面是一个例子: interface MyType { foo: string bar?: number } const merge = (value1: MyType, value2: KindaPartial<MyType>): MyType => { return {...value1, ...value2}; } const value = { foo: 'foo', bar: 42 }

如何创建一种-
Partial
类型,它不允许
未定义的值

下面是一个例子:

interface MyType {
  foo: string
  bar?: number
}

const merge = (value1: MyType, value2: KindaPartial<MyType>): MyType => {
  return {...value1, ...value2};
}



const value = {
  foo: 'foo',
  bar: 42
}

merge(value, {});                          // should work
merge(value, { foo: 'bar' });              // should work
merge(value, { bar: undefined });          // should work
merge(value, { bar: 666 });                // should work
merge(value, { foo: '', bar: undefined }); // should work
merge(value, { foo: '', bar: 666 });       // should work

// now the problematic case:
merge(value, { foo: undefined }); // this should throw an error
                                  // because MyType["foo"] is of type string
接口MyType{
foo:string
酒吧:号码
}
常量合并=(value1:MyType,value2:KindaPartial):MyType=>{
返回{…value1,…value2};
}
常量值={
福:‘福’,
酒吧:42
}
合并(值,{});//应该有用
合并(值,{foo:'bar'});//应该有用
合并(值,{bar:undefined});//应该有用
合并(值,{bar:666});//应该有用
合并(值,{foo:'',bar:undefined});//应该有用
合并(值,{foo:'',bar:666});//应该有用
//现在有问题的情况是:
合并(值,{foo:undefined});//这将抛出一个错误
//因为MyType[“foo”]是string类型
我要找的类型应该是:

  • 仅接受泛型类型上存在的键(就像普通的
    部分
  • 接受泛型类型的键的子集
  • 但是如果泛型类型不接受该键的
    未定义
    ,则不接受
    未定义
这可能吗



编辑:我还在TypeScript存储库中创建了一个问题,因为这很奇怪,在某个时候应该会引发一个错误:

TypeScript没有正确区分对象属性(和函数参数),这些属性缺失,而对象属性存在,但
未定义。
Partial
允许
未定义的
属性就是这样的结果。正确的做法是等待这个问题得到解决(如果您在GitHub中找到这个问题并给它一个,那么这种情况下,
Pick
应该可以工作

interface MyType {
  foo: string
  bar?: number
}

const merge = <K extends keyof MyType>(value1: MyType, value2: Pick<MyType, K>): MyType => {
  return {...value1, ...value2};
}

merge(value, {});                          // ok
merge(value, { foo: 'bar' });              // ok
merge(value, { bar: undefined });          // ok
merge(value, { bar: 666 });                // ok
merge(value, { foo: '', bar: undefined }); // ok
merge(value, { foo: '', bar: 666 });       // ok

merge(value, { foo: undefined });          // ng
接口MyType{
foo:string
酒吧:号码
}
常量合并=(值1:MyType,值2:Pick):MyType=>{
返回{…value1,…value2};
}
合并(值,{});//确定
合并(值,{foo:'bar});//确定
合并(值,{bar:undefined});//确定
合并(值,{bar:666});//确定
合并(值,{foo:'',bar:undefined});//确定
合并(值,{foo:'',bar:666});//确定
合并(值,{foo:undefined});//ng

谢谢你的解释!我对这个问题表示赞同。自从它问世以来,我一直使用TypeScript和Partial,但这是我第一次偶然发现这个问题。因为它需要所有属性,而且根本不是Partial?不,请参见。
{[p in K]:X}
K
的每个联合成员都有一个属性。您的
KindaMyType
MyType
的类型相同。您可以(不安全地)使用类型断言(您称之为“强制转换”)来缩小
{bar:666}
to
MyType
与接受部分
MyType
的函数不同。我很惊讶你在评论中没有提到类型断言,因为这是你解决问题的关键。请记住,这样做可能会使你的代码更难编程使用;你可能会禁止更新(value:MyType,new_foo_val?:string){返回合并(value,{foo:new_foo_val})