环境
TypeScript的版本为3.2.1,“tsconfig.json”如下所示。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true
}
}
问题
我正在TypeScript中查找部分“部分”类型。
type Entity = {
a: string,
b: string,
c?: string,
};
type Ham = MyType<Entity, 'b'>;
/**
* expected to equal
* {
* a: string,
* b?: string, // changed to be optional
* c?: string,
* };
*/
P.S.提香和汤扬
谢谢你的回复。我检查了你的类型,然后两个类型通过编译器的检查!
const abc = { a: 'a', b: 'b', c: 'c' };
const ab = { a: 'a', b: 'b' };
const ac = { a: 'a', c: 'c' };
const a = { a: 'a' };
// by t7yang
let test1Abc: OptionalKey<Entity, 'b'> = abc;
let test1Ab: OptionalKey<Entity, 'b'> = ab;
let test1Ac: OptionalKey<Entity, 'b'> = ac;
let test1A: OptionalKey<Entity, 'b'> = a;
// by Titian Cernicova-Dragomir
let test2Abc: PickPartial<Entity, 'b'> = abc;
let test2Ab: PickPartial<Entity, 'b'> = ab;
let test2Ac: PickPartial<Entity, 'b'> = ac;
let test2A: PickPartial<Entity, 'b'> = a;
4条答案
按热度按时间u7up0aaq1#
可以将
Pick
与Partial
结合使用,只挑选希望设置为可选的属性,同时保留其余属性,使用Exclude
获取键,但不包括传入的设置为可选的键:6tqwzwtp2#
这个想法是挑选所有的属性,要使可选的,然后合并与类型比我们要使属性可选。
你可以在打字场查一下
jw5wzhpr3#
真实的简单的解决方案:
Titian的解决方案是在Typescript 3.5之前编写的,Typescript 3.5添加了Omit帮助器。
还请记住,您可以使用字符串联合来挑选多个属性,使其成为可选属性:
mrfwxfqh4#
接受答案的简单版本(使用Partial和Pick的交集),没有任何中间类型来混淆事物:
Playground