是否可以选择严格传播对象?

2024-04-05

我想知道是否有编译器选项或类似的东西可以使传播对象严格。

请参阅以下示例以了解我的意思:

interface Foo {
  a: string;
}

interface Bar {
  a: string;
  b: number;
}

const barObject: Bar = { a: "a string", b: 1 };

// should give a warning because Bar has more properties (here b) than Foo
const fooObject: Foo = { ...barObject };

// actually prints 1
console.log((fooObject as any).b); 

这样的事情可能吗?


有趣的问题。根据这个问题 https://github.com/microsoft/TypeScript/issues/19775,扩展运算符的结果旨在not扳机超额财产检查 https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks.


// barObject has more props than Foo, but spread does not trigger excess property checks
const fooObject: Foo = { ...barObject };

// b is explicit property, so checks kicks in here
const foo: Foo = { ...bar, b: 2 }

没有确切的类型 https://github.com/microsoft/TypeScript/issues/12936目前适用于 TypeScript,但您可以创建一个简单的类型检查来强制执行严格的对象传播:

// returns T, if T and U match, else never
type ExactType<T, U> = T extends U ? U extends T ? T : never : never

const bar: Bar = { a: "a string", b: 1 };
const foo: Foo = { a: "foofoo" }

const fooMergeError: Foo = { ...bar as ExactType<typeof bar, Foo> }; // error
const fooMergeOK: Foo = { ...foo as ExactType<typeof foo, Foo> }; // OK

通过辅助函数,我们可以减少一些冗余:

const enforceExactType = <E>() => <T>(t: ExactType<T, E>) => t

const fooMergeError2: Foo = { ...enforceExactType<Foo>()(bar) }; // error

代码示例 https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgGIHt3IN4FgBQyRycAXMgM5hSgDmA3AQL4EGiSyIoBCcUOBYiXJUaIBoOIAjciACuAWynRG+FvgIB6TcigQwcqCArIAKgBpkwGGZIgAJsgCqyCAA9EYSxAA2FFCAQAG7QBGAAngAOKACiHghgplEQADwWzgB8yAC8tu6QDiYuAPzOrm4F9iamyKU1ssHQyA0hUKz4COjGYMhSfOS8-LnYwsgARHCU1HRjljLIAIzITKqd3cgwmOQYWMOjY5voh2PL7WtUG5gAstC0EDFQUOhQ25g5OMgAdN99-HAmcU8SWiKQi0SOvT4lh2WRWyG0rkezwI5x6hxuUDuAHkANKvXYfb6fQ4kAHxRLJUHJCGHaGYWH0eE6XFnLoXCAgTZQJCAhLAlC5FIxDIACgAlDksmlRWByLyKSD0sKJdksmB2hyuTzyfyUjDxSLsGRxgArf4+ewAaxgYyYEoRAHdnpaKARNc9tUDKfqxYb9maKBbrbNeuQAMzLe06aBPKBzcpICgmSJPSKs9bo273JFQABM+PeIyJ7u59x13vpBt+ErhCJjzyAA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以选择严格传播对象? 的相关文章

随机推荐