如何在typescript中仅克隆类型属性

如何在typescript中仅克隆类型属性,typescript,Typescript,假设我有代码: type SimpleState = { a1: string // little more properties } type ComplexState = SimpleState & { b1: numeric, c1: boolean // many other properties } const workingState :ComplexState = // all properties initialozation const statePar

假设我有代码:

type SimpleState = 
{
   a1: string
// little more properties
}

type ComplexState = 
SimpleState
& {
b1: numeric,
c1: boolean
// many other properties
}

const workingState :ComplexState = // all properties initialozation

const stateParam :SimpleState = workingState;

cacheSimpleState(stateParam)

在运行时cacheSimpleState接收具有所有属性的ComplexState对象。有没有办法将workingState克隆到stateParam,使其仅具有SimpleEstate属性?

不幸的是,没有。Typescript无法在运行时检查接口成员

一个选项是手动列出道具,尽管不是很花哨:

函数cacheSimpleState(数据:T):SimpleState{
返回{
a1:data.a1
}
}
这样,如果
SimpleState
需要更多数据,至少您的构建会知道。 但是,如果出现可选参数,则需要小心。 一种选择是:

类型SimpleState=
{
a1:字符串;
b1?:字符串;
}
const defaultSimpleState:SimpleState={//所有必需的道具
a1:“”
}
const defaultOptionalState:SimpleState={//所有可选的道具
…不动产,
b1:'
}
函数cacheSimpleState(数据:T):SimpleState{
让props:Partial={};
for(让道具插入数据){
if(道具处于defaultSimpleState | |道具处于defaultOptionalState){
props={…props[prop]:数据[prop]};
}
}
归还道具作为财产;
}

不幸的是,没有。Typescript无法在运行时检查接口成员

一个选项是手动列出道具,尽管不是很花哨:

函数cacheSimpleState(数据:T):SimpleState{
返回{
a1:data.a1
}
}
这样,如果
SimpleState
需要更多数据,至少您的构建会知道。 但是,如果出现可选参数,则需要小心。 一种选择是:

类型SimpleState=
{
a1:字符串;
b1?:字符串;
}
const defaultSimpleState:SimpleState={//所有必需的道具
a1:“”
}
const defaultOptionalState:SimpleState={//所有可选的道具
…不动产,
b1:'
}
函数cacheSimpleState(数据:T):SimpleState{
让props:Partial={};
for(让道具插入数据){
if(道具处于defaultSimpleState | |道具处于defaultOptionalState){
props={…props[prop]:数据[prop]};
}
}
归还道具作为财产;
}

函数不需要使用泛型t,因为它们不使用t的任何附加属性,并且扩展SimpleEstate的任何t都可以分配给SimpleEstate。它可以只是一个接受SimpleState并返回SimpleState的函数。(虽然我可以从可读性的角度看到使用“extends”的好处)。我之所以使用泛型T,是因为我想确保
SimpleState
中的任何强制属性都将位于
data
中,并且类型正确,
函数cacheSimpleState(数据:SimpleState)不是这样吗:SimpleState
也是吗?我想在这种情况下,您将面临索引问题。我做了一个测试,让
元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型为“SimpleState”
errorHuh。你说得对,但那真的很奇怪!我不明白为什么
prop
for(让prop进入数据)
中的类型是
Extract
for
t
,而不仅仅是
string
,而
string
的类型是
SimpleState
。我想我今天学到了一些新的东西。函数不需要使用泛型t,因为它们没有使用t的任何附加属性,并且扩展SimpleEstate的任何t都可以分配给SimpleEstate。它可以只是一个接受SimpleState并返回SimpleState的函数。(虽然我可以从可读性的角度看到使用“extends”的好处)。我之所以使用泛型T,是因为我想确保
SimpleState
中的任何强制属性都将位于
data
中,并且类型正确,
函数cacheSimpleState(数据:SimpleState)不是这样吗:SimpleState
也是吗?我想在这种情况下,您将面临索引问题。我做了一个测试,让
元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型为“SimpleState”
errorHuh。你说得对,但那真的很奇怪!我不明白为什么
prop
for(让prop进入数据)
中的类型是
Extract
for
t
,而不仅仅是
string
,而
string
的类型是
SimpleState
。我想我今天学到了一些新东西。