我正在尝试创建一个可以拥有的界面
export interface MenuItem {
title: string;
component?: any;
click?: any;
icon: string;
}
Run Code Online (Sandbox Code Playgroud)
component或click设置我很惊讶地发现 TypeScript 不会抱怨我做这样的事情:
type sth = { value: number, data: string } | { value: number, note: string };
const a: sth = { value: 7, data: 'test' };
const b: sth = { value: 7, note: 'hello' };
const c: sth = { value: 7, data: 'test', note: 'hello' };
Run Code Online (Sandbox Code Playgroud)
我想也许value被选为类型联合判别式或其他东西,因为我唯一能想出解释这一点的是,TypeScript 是否以某种方式number在这里理解1 | 2为例如的超集。
所以我改变value是value2在第二对象上:
type sth = { value: number, data: string } | { value2: number, note: …Run Code Online (Sandbox Code Playgroud) 我有一个带参数的方法.我希望Typescript验证传入的对象(在typescript编译时,我理解运行时是一个不同的动物)只满足一个允许的接口.
例:
interface Person {ethnicity: string;}
interface Pet {breed: string;}
function getOrigin(value: Person ^ Pet){...}
getOrigin({}); //Error
getOrigin({ethnicity: 'abc'}); //OK
getOrigin({breed: 'def'}); //OK
getOrigin({ethnicity: 'abc', breed: 'def'});//Error
Run Code Online (Sandbox Code Playgroud)
我意识到这Person ^ Pet不是有效的Typescript,但这是我认为首先尝试并且看似合理的东西.
我正在尝试创建一个通过dataprop 渲染的表格,或者您可以直接通过children. 为此,我需要一种接受 或 的data类型children。
我已经找到了这些解决方案,但它在某种程度上不适用于 React Component。仅适用于普通物体。
所以基本上我创建了三个接口,一个具有基本类型,一个具有data,一个具有children. 但是当我创建 React 组件时,它对我大喊这些道具不存在TableProps
有谁知道我做错了什么?这是沙箱:https://codesandbox.io/s/admiring-shadow-vw148? file=/src/table.tsx
谢谢!
考虑这个代码:
let foo: {a: any} | {b: any} = {a: 1, b: 2};
Run Code Online (Sandbox Code Playgroud)
我希望 TypeScript 拒绝此代码,因为此联合类型意味着第一种类型或第二种类型,并且该值不可分配给它们中的任何一种,因此类型检查应拒绝它。但事实上它过去了,为什么呢?
(对于背景,上述类型旨在成为“此属性或该属性,但不是两者都类型”。请参阅Typescript 接口 - 是否需要“一个或另一个”属性?)
我们可以做到这一点:
interface IMyInterface{
firstname:string // this means firstname is mandatory
name:string // this also means name is mandatory
}
Run Code Online (Sandbox Code Playgroud)
我该怎么说,firstname还是name可选(?),取决于是否提供了另一个?
或者,如果那不可能,还有哪些其他选择?
编辑:这不是Typescript接口的重复-可能需要“一个或另一个”属性吗?。
我们不想为每个可选元素创建一个单独的接口,仅仅是因为维护,命名和重构会很麻烦,并且不可重用。
是否可以基于TypeScript中的条件类型使函数具有强制性参数或可选参数?
到目前为止,这是我得到的:
const foo = <T extends string | number>(
first: T,
second: T extends string ? boolean : undefined
) => undefined;
foo('foo', true); // ok, as intended
foo(2, true); // not ok, as intended
foo(2, undefined); // ok, as intended
foo(2); // compiler error! I want this to be ok
Run Code Online (Sandbox Code Playgroud)