TypeScript的版本为3.2.1,“ tsconfig.json”如下所示。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true
}
}
我正在寻找TypeScript中的部分"Partial"类型。
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;
答案 0 :(得分:1)
您可以将Pick
与Partial
结合使用,以仅选择要设置为可选的属性,同时使用Exclude
保留其余属性,以获取不包括传入的密钥。设为可选:
type Entity = {
a: string,
b: string,
c?: string,
};
type PickPartial<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>
type Ham = PickPartial<Entity, 'b'>; // a, b? , c?
答案 1 :(得分:1)
type Entity = {
a: string,
b: string,
c?: string,
};
type OptionalKey<T, O extends keyof T> = Pick<T, Exclude<keyof T, O>> & Partial<{ [P in O]: T[P] }>;
const a: OptionalKey<Entity, 'b'> = {
a: 'a',
}
const ab: OptionalKey<Entity, 'b'> = {
a: 'a',
b: 'b'
}
const ac: OptionalKey<Entity, 'b'> = {
a: 'a',
c: 'c'
}
我们的想法是选择所有要设为可选的属性,然后与我们希望使该属性设为可选的类型合并。
中进行检查