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}
toMyType
与接受部分MyType
的函数不同。我很惊讶你在评论中没有提到类型断言,因为这是你解决问题的关键。请记住,这样做可能会使你的代码更难编程使用;你可能会禁止更新(value:MyType,new_foo_val?:string){返回合并(value,{foo:new_foo_val})
。